基本通用模板
#指定cmake最低版本
cmake_minimum_required(VERSION 3.9)
#设置工程名字
project(modle)
# 输出测试
message("hello")
message(STATUS ${PROJECT_NAME})
#指定语言版本 这里指定C++11
set(CMAKE_CXX_STANDARD 11)
#设定源码列表.cpp 假如你只有一两个源码文件
set(SOURCE_FILE ./main.cc)
#设定所有源码列表 方式一
# 假如你有好多个源码文件放在在CAMKE_SOURCE_DIR这个目录下,其实这个目标就是工程目录,即CMakeLists.txt所在目录
#aux_source_directory(${CAMKE_SOURCE_DIR} DIR) #将${CAMKE_SOURCE_DIR}目录下,也就是最顶级目录下所有的.cpp文件放入DIR变量中,后面add_executable就可很简化啦
#aux_source_directory(../src DIR) 诶,我还有一些不小心放在其他地点的源码文件,我也要放在DIR变量中
#设定所有源码列表 方式二
FILE(GLOB DIR ${PROJECT_SOURCE_DIR}/*.cpp}) #匹配源码目录所有.cpp文件
FILE(GLOB_RECURSE DIR ${PROJECT_SOURCE_DIR}/*.cpp) # 递归搜索匹配源码目录和其子目录下的.cpp文件
#add_executable(hello_world ${DIR}) 设置源码列表后,获得可执行文件这一步就很方便了,不用巴拉巴拉写一长串源码文件; 这里只是说明下,不是这句真写在这个地方
#设定头文件路径
include_directories(../include/)
#inclde_directories("路径1" “路径2”)
#设定链接库的路径(一般使用第三方非系统目录下的库) 比如opencv??
link_directories(../build/)
link_directories("路径1" “路径2)
#添加子目录,作用相当于进去子目录里面,展开子目录的CMakeLists.txt
#同时执行,子目录中的CMakeLists.txt一般是编译成一个库,作为一个模块
#在父目录中可以直接引用子目录生成的库
#add_subdirectory(math)
#生成动静态库
#add_library(动静态链接库名称 SHARED/STATIC(可选,默认STATIC) 源码列表)
add_libarary(model STATIC ${DIR}) # 生成libmodel.a
add_libarary(model SHARED ${DIR}) #生成libmodel.so
#生成可执行文件
add_executable(modle ${SOURCE_FILES})
target_link_libaries(${PROJECT_NAME} pthred glog) #就是g++ 编译选项中-l后的内容,不要有多余空格
ADD_CUSTOM_COMMAND(#执行shell命令
TARGET modle
POST_BUILD # 在目标文件model build之后,执行下面的拷贝命令,还可以选择PRE_BUILD命令将会在其他依赖项执行前执行 PRE_LINK命令将会在其他依赖项执行完后执行 POST_BUILD命令将会在目标构建完执行
COMMAND cp ./model ../
)
常见宏(默认变量)
宏 | 说明 |
---|---|
PROJECT_NAME | project()设置的工程名 |
PROJECT_SOURCE_DIR | 工程源码目录,例如~/Hello/ 应该就是CMakeLists.txt所在目录 |
PROJECT_BINARY_DIR | 生成文件目录,例如~/Hello/build |
了解其他宏:歪猴:cmake常用变量
小结
其实整个CMakeLists.txt最基本的就是描述这样一个事件,诶,我要编译一份源代码,生成可执行文件。所以需要了解编译,才能看懂CMakeLists.txt。比如为什么设置链接库的路径?为什么要生成动静态库,我直接生成可执行文件不行吗?
参考: