CMakeLists使用总结
常用变量
预定义变量
# 工程的根目录
PROJECT_SOURCE_DIR
# 运行cmake命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build
PROJECT_BINARY_DIR
# 返回通过project命令定义的项目名称
PROJECT_NAME
# 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_SOURCE_DIR
# target编译目录
CMAKE_CURRENT_BINARY_DIR
开关选项
# 设置C编译选项,也可以通过add_definitions()添加
CMAKE_C_FLAGS
# 设置CPP编译选项,也可以通过add_definitions()添加
CMAKE_CXX_FLAGS
CMakeLists.txt的编写
子目录下的 CMakeLists.txt 文件
# 搜索当前目录下所有.cpp文件
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library(myMathFuncs ${DIR_LIB_SRCS})
根目录下的 CMakeLists.txt 文件
# 指定cmake的最小版本
cmake_minimum_required(VERSION 3.0)
# 设置项目的project名称
# 会自动创建两个变量,PROJECT_SOURCE_DIR和PROJECT_NAME
# ${PROJECT_SOURCE_DIR}:本CMakeLists.txt所在的文件夹路径
# ${PROJECT_NAME}:本CMakeLists.txt的project名称
project(Test_demo)
# 配置编译选项
add_definitions("-Wall -g")
# 指定编程语言版本
add_definitions(-std=c++11)
# 配置编译类型
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Wall -O2")
# 设置变量,并用${变量}获取变量内容
# (1)set直接设置变量的值
set(SRC_LIST main.cpp test.cpp)
# (2)set追加设置变量的值
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
# (3)list追加或者删除变量的值
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
# 打印消息. 格式:message(消息)
message(${PROJECT_SOURCE_DIR})
message("build with debug mode")
message(WARNING "this is warnning message")
# 查找指定的包文件
find_package(OPENCV REQUIRED opencv)
# 添加include目录 -- 头文件的搜索目录
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/third_party/tools_1/include
third_party/tools_2/include
)
# 添加子目录
add_subdirectory(myMath)
# 设置编译类型,分三类:
# add_executable(demo main.cpp) # 生成可执行文件
# add_library(common STATIC func.cpp) # 生成静态库
# add_library(common SHARED func.cpp) # 生成动态库或共享库
# 该示例为:编译可执行文件
#(1)明确指定包含哪些源文件
add_executable(${PROJECT_NAME}
main.cpp
protocol/func_1.cpp
protocol/func_2.cpp
)
#(2)搜索所有的cpp文件
aux_source_directory(. SRC_LIST) # 搜索当前目录下所有.cpp文件
aux_source_directory(protocol SRC_PROTOCOL_LIST) # 搜索protocol目录下所有.cpp文件
add_executable(${PROJECT_NAME}
${SRC_LIST}
${SRC_PROTOCOL_LIST}
)
#(3)自定义搜索规则
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_executable(${PROJECT_NAME}
${SRC_LIST}
)
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_executable(${PROJECT_NAME}
${SRC_LIST}
${SRC_PROTOCOL_LIST}
)
# 或者
file(GLOB_RECURSE SRC_LIST "*.cpp") # 递归搜索
file(GLOB SRC_PROTOCOL_LIST RELATIVE "protocol" "*.cpp") # 相对protocol目录下搜索
add_executable(${PROJECT_NAME}
${SRC_LIST}
${SRC_PROTOCOL_LIST}
)
# 设置target需要链接的库
target_link_libraries(${PROJECT_NAME}
${OPENCV_LIBRARIES}
${CMAKE_CURRENT_SOURCE_DIR}/third_party/tools_1/lib/lib*.so
third_party/tools_2/lib/lib*.a
myMathFuncs
pthread
)
# 安装
install(TARGETS ${PROJECT_NAME})
CMakeLists.txt的编译
在最顶层创建build文件夹,然后编译。即:
mkdir build && cd build
cmake ..
make
最终生成可执行文件:Test_demo
可以通过以下命令来运行该可执行文件:
./Test_demo
参考:
https://blog.csdn.net/qq_38410730/article/details/102477162
https://blog.csdn.net/afei__/article/details/81201039