一. Cmake 简介
二. 常用指令
1. 指定需要的最小的cmake版本
cmake_minimum_required(VERSION 3.4.0)
此命令是optional,如果CMakeLists.txt中使用了特定版本中才具备的命令,就需要加上这个行,提醒用户升级到了较高版本之后在执行cmake。
2. 设置项目名称
project(projectName)
此命令是optional。如果添加此命令,会引入两个变量projectName_BINARY_DIR和projectName_SOURCE_DIR, 同时cmake会自动定义变量PROJECT_BINARY_DIR 和PROJECT_SOURCE_DIR.
3. 设置编译类型
add_executable(projectname) # 生成可执行文件
add_library(common STATIC demo.cpp) #生成静态库
add_library(common SHARED demo.cpp) #生成动态库或共享库
在linux下生成文件为:projectname
libcommon.a
libcommon.so
在window下生成文件为:projectname.exe
libcommon.lib
libcommon.dll
4. 指定编译包含的源文件
- 明确指定包含哪些源文件
add_library(demo demo.cpp test_1.cpp test_2.cpp )
- 搜索所有的cpp文件
aux_source_directory(. SRC_LIST) #搜索当前目录下的所有.cpp文件并保存到SRC_LIST变量中
add_library(demo ${SRC_LIST})
- 自定义搜索规则
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(demo ${SRC_LIST})
#或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
#或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
5. 查找指定库文件
find_library()
6. 设置包含的目录
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
)
linux 下还可以通过如下方式设置包含的目录
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")
7. 设置链接库搜索目录
link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/libs
)
linux下还可以通过如下方式设置包含的目录
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs")
8. 设置target需要链接的库
target_link_libraries(<name> lib1 lib2 lib3) #将lib1,lib2,lib3链接到<name>上
target_link_libraries 里库文件的顺序符合被依赖的库放在依赖它的库的后面,例如上面的例子中lib1可能依赖lib2和lib3.
- 指定链接动态链接库或静态链接库
target_link_libraries(demo lib1.a) # 链接lib1.a
target_link_libraries(demo lib2.so) # 链接lib2.so
- 指定全路径
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/lib1.a) # 链接lib1.a
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/lib2.so) # 链接lib2.so
- 指定链接多个库
target_link_libraries(demo
${CMAKE_CURRENT_SOURCE_DIR}/libs/lib1.a
boost_system.a
boost_thread
pthread
)
9. 设置变量
- set设置变量的值
set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})
- set追加设置变量的值
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})
- list追加或删除变量的值
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEN SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})
10 文件操作命令
file
#将message写入filename文件中,会覆盖文件原有内容
file(WRITE filename "message")
#将message写入filename文件中,会追加在文件末尾
file(APPEND filename "message")
#从filename文件中读取内容并保存到var变量中,如果指定了numBytes和offset,则从offset处开始最多读numBytes个字节 ,另外如果指定了HEX参数,则内容会以16进制形式存储在var变量中
file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
#创建目录
file(MAKE_DIRECTORY [dir1 dir2 ...])
#会把path转换为以unix的/开头的cmake风格的路径,保存在result中
file(TO_CMAKE_PATH path result)
#它会把cmake风格的路径转换为本地路径风格:windows下用‘\’,而unix下用‘/’
file(TO_NATIVE_PATH path result)
参考: https://blog.youkuaiyun.com/afei__/article/details/81201039;
https://www.jianshu.com/p/8909efe13308