基础
一个最简单的cmake示例
|
|
PROJECT
的指令语法
|
|
上指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR
,<projectname>_SOURCE_DIR
,同时还预定义了变量PROJECT_BINARY_DIR
, PROJECT_SOURCE-DIR
(等价于之前两个变量)。
SET
指令语法:
|
|
例子:
SET (SRC_LIST main.cpp t1.cpp t2.cpp)
用于显式的定义变量,引用变量可使用${}
。但是在IF
控制语句中是直接使用变量名。参数之间可以使用分号或空格来进行分割
MESSAGE
指令的语法
|
|
用于向终端输出用户定义的信息
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为hello
的可执行文件
ADD_SUBDIRECTORY
指令的语法
|
|
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
例子: ADD_SUBDIRECTORY(src bin)
将src子目录加入工程,并指定编译输出路径为bin目录
条件控制命令为 if
命令:
|
|
循环控制示例:
|
|
while 循环范例:
|
|
aux_source_directory
命令
命令语法:aux_source_directory(<dir><variable>)
命令简述:用于将 dir 目录下的所有源文件的名字保存在变量variable中
使用范例:aux_source_directory(. DIR_SRCS)
add_executable
命令
命令语法:add_executable(<name> [WIN32][MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 name
使用范例:add_executable(Main ${DIR_SRCS})
add_library
命令
命令语法:add_library([STATIC | SHARED |MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为 name
使用范例:add_library(one STATIC two.cpp three.h)
add_dependencies
命令
命令语法:add_dependencies(target-namedepend-target1 depend-target2 …)
命令简述:用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。这里的目标必须是add_executable、add_library、add_custom_target命令创建的目标
add_subdirectory
命令
命令语法:add_subdirectory(source_dir[binary_dir] [EXCLUDE_FROM_ALL]) 命令简述:用于添加一个需要进行构建的子目录 使用范例:add_subdirectory(Lib)
target_link_libraries
命令
命令语法:target_link_libraries(
set
命令
命令语法:set(
unset
命令
命令语法:unset(
message
命令
命令语法:message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]“message to display” …) 命令简述:用于输出信息 使用范例:message(“Hello World”)
include_directories
命令
命令语法:include_directories([AFTER|BEFORE][SYSTEM] dir1 dir2 …) 命令简述:用于设定目录,这些设定的目录将被编译器用来查找 include 文件 使用范例:include_directories(${PROJECT_SOURCE_DIR}/lib)
find_path
命令
命令语法:find_path(name1 [path1 path2 …]) 命令简述:用于查找包含文件 name1 的路径,如果找到则将路径保存在 VAR中(此路径为一个绝对路径),如果没有找到则结果为-NOTFOUND。默认的情况下,VAR会被保存在 Cache中,这时候我们需要清除 VAR 才可以进行下一次查询(使用 unset命令)。 使用范例:
|
|
find_library
命令
命令语法:find_library(name1 [path1 path2 …]) 命令简述:用于查找库文件 name1 的路径,如果找到则将路径保存在 VAR中(此路径为一个绝对路径),如果没有找到则结果为-NOTFOUND。一个类似的命令link_directories已经不太建议使用了
add_definitions
命令
命令语法:add_definitions(-DFOO-DBAR …) 命令简述:用于添加编译器命令行标志(选项),通常的情况下我们使用其来添加预处理器定义 使用范例:add_definitions(-D_UNICODE -DUNICODE)
file
命令
命令简述:此命令提供了丰富的文件和目录的相关操作(这里仅说一下比较常用的) 使用范例:
|
|
target_include_directories(one PUBLIC include)
命令
为目标添加include文件夹。
cmake中如何生成动态库和静态库 参考ADD_LIBRARY和SET_TARGET_PROPERTIES用法 t3示例
cmake中如何使用动态库和静态库(查找库的路径) 参考INCLUDE_DIRECTORIES, LINK_DIRECTORIES, TARGET_LINK_LIBRARIES用法 t4示例使用动态库或静态库 t5示例如何使用cmake预定义的cmake模块(以FindCURL.cmake为例演示) t6示例如何使用自定义的cmake模块(编写了自定义的FindHELLO.cmake) 注意读t5和t6的CMakeLists.txt和FindHELLO.cmake中的注释部分
cmake中如何指定生成文件的输出路径 如上ADD_SUBDIRECTORY的时候指定目标二进制文件输出路径(推荐使用下面这种) 使用SET命令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量来指定最终的二进制文件的位置 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 上面的两条命令通常紧跟ADD_EXECUTABLE和ADD_LIBRARY,与其写在同一个CMakeLists.txt即可 cmake中如何增加编译选项 使用变量CMAKE_C_FLAGS添加C编译选项 使用变量CMAKE_CXX_FLAGS添加C++编译选项 使用ADD_DEFINITION添加
cmake中如何增加头文件路径 参考INCLUDE_DIRECTORIES命令用法
cmake中如何在屏幕上打印信息 参考MESSAGE用法
cmake中如何给变量赋值 参考SET和AUX_SOURCE_DIRECTORY用法
建议:在Project根目录先建立build,然后在build文件夹内运行cmake ..,这样就不会污染源代码, 如果不想要这些自动生成的文件了,只要简单的删除build文件夹就可以