1.CMake语法
1.1 指定cmake的最小版本
cmake_minimum_required(version 版本号)
例如:
cmake_minimum_required(version 2.8)
1.2 定义工程名称
#定义工程名称
project(项目名称)
例如:
project(MyTest)
1.3 显示定义变量
set(var [value])
例如:
# 第一种用法,生成代码文件列表
#先直接设置SRC_LIST的值
set(SRC_LIST add.h add.cpp)
#然后再在SRC_LIST中追加main.cpp
set(SRC_LIST ${SRC_LIST} main.cpp)
# 第二中用法,设置库生成目录或者可执行文件生成目录
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/linux)
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
1.4 设置编译类型
# 编译静态库
add_library(库名称 STATIC 代码文件名称)
# 编译动态库
add_library(库名称 SHARED 代码文件名称)
# 编译可执行程序
add_executable(可执行程序名 代码文件名称)
例如:
# 编译静态库
add_library(add STATIC add.h add.cpp)
add_library(add STATIC ${ADD_SRC} ${ADD_HDR})
# 编译动态库
add_library(add SHARED add.h add.cpp)
add_library(add SHARED ${ADD_SRC} ${ADD_HDR})
# 编译可执行程序
add_executable(main add.h add.cpp mai.cpp)
add_executable(main ${MAIN_SRC} ${MAIN_HDR})
1.5 指定静态库或者动态库编译输出目录
例如将当前编译的静态库或者动态库输出到当前项目文件夹lib子目录下
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
1.6 指定可执行程序编译输出目录
例如将当前可执行程序输出到当前项目文件夹的bin子目录下
#设定可执行二进制文件的目录
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
1.7 设置链接库搜索目录
例如将链接库搜索目录设置为当前项目文件夹下lib/linux文件夹
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
1.8 设置包含目录
例如将包含目录设置为当前项目文件夹下include文件夹
include_directories(${PROJECT_SOURCE_DIR}/include)
1.9 设置宏定义
#预定义宏
add_definitions(-D宏名称)
例如:
add_definitions(-DWINDOWS)
add_definitions(-DLINUX)
1.10 链接静态库
link_libraries(
静态库1
静态库2
静态库3
...
)
注意,link_libraries中的静态库为全路径,常与1.7 link_directories 搭配使用,例如:
lib1.a lib2.a在目录${PROJECT_SOURCE_DIR}/lib/linux下,则先设置链接目录,再链接相应的库
#设置链接目录
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
link_libraries(
lib1.a
lib2.a
)
1.11 链接动态库
target_link_libraries(所需生成的文件名称 所需链接的动态库名称)
例如
target_link_libraries(main dl)
1.12 link_libraries 和 target_link_libraries 区别
在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:
(1) link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
(2) link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库
1.13 file语法
1.13.1 将文件夹所有的类型的文件添加到文件列表
例如将当前文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹下所有.h加入到MAIN_HDR中。
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
例如将当前文件夹子目录src文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹子目录src文件夹下所有.h加入到MAIN_HDR中。
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h)
1.13.2 递归搜索该文件夹,将文件夹下(包含子目录)符合类型的文件添加到文件列表
例如将当前文件夹下(包括子目录下)所有.cpp文件的文件名加入到MAIN_SRC中,所有.h加入到MAIN_HDR中
file(GLOB_RECURSE MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
1.14 List操作
常见的List操作包括:
list(LENGTH