目录
1、工程框架介绍
2、编写CMakeLists.txt
(1) 限制cmake最低版本、工程命名
(2) 引入头文件目录
(3) 引入库目录(可选)
(4) 引入源文件
(5) 生成可执行文件 / 生成动静态库
(6) 链接库文件(可选)
3、完整CMakeLists.txt
1、工程框架介绍
cmake搭建需要关注的是工程的整体架构,其实就是把你需要用到的文件都交给cmake管理。编译的时候,你的程序需要什么,cmake就给什么;如果没有程序要求的东西,cmake就会报错。
2、编写CMakeLists.txt
(1) 限制cmake最低版本、工程命名
# 限制 cmake 最低版本为 3.0
cmake_minimum_required(VERSION 3.0)
# 为当前工程命名
project(tool_test)
-
PROJECT_NAME:cmake预置变量,代表当前工程的名字,即 tool_test
(2) 引入头文件目录
其实就是将我们项目里用到的所有头文件都交给 cmake 管理,在上面的工程里,vac/tool、vac/util 以及 app1 目录下都有头文件,所以我们要告诉 cmake 这些目录下有头文件。
include_directories(${PROJECT_SOURCE_DIR}/app1)
include_directories(${PROJECT_SOURCE_DIR}/vac/tool)
include_directories(${PROJECT_SOURCE_DIR}/3rd-part/include)
- PROJECT_SOURCE_DIR:cmake预置变量,代表顶层CMakeLists.txt 文件所在路径
(3) 引入库目录(可选)—— 对应下面的链接库文件
如果当前项目需要使用开源的第三方库 或者 自己定义的第三方库,那就需要让cmake知道这个库在哪,否则在使用库文件中的某个函数时,会报 undefined_reference 的错误,其实就是没有找到对应的函数定义。
这里就以自己定义的第三方库为例。(一般提供第三方库至少需要提供两个内容,一个是头文件,告诉别人有哪些函数可以使用;一个是 .so 或者 .a 文件,即函数定义)
link_directories(${PROJECT_SOURCE_DIR}/3rd-part/lib)
(4) 引入源文件
头文件表示有哪些函数可供你使用,源文件就代表这些函数的具体实现 或者 main函数所在文件。因为程序在链接阶段,会根据符号表去找对应的函数定义,如果没找到函数定义,就会报 undefined_reference 的错误。
############################################################
#
# file(GLOB <variable_name> ... ) 表示将列举的内容添加到变量中
#
############################################################
file(GLOB ALL_SOURCES
${PROJECT_SOURCE_DIR}/app1/*.cpp
${PROJECT_SOURCE_DIR}/vac/tool/*.cpp
)
(5) 生成可执行文件 / 生成动静态库
# 生成名为 ${PROJECT_NAME} 的可执行文件,该可执行文件的生成依赖的源文件是 ${ALL_SOURCES}
add_executable(${PROJECT_NAME} ${ALL_SOURCES})
(6) 链接库文件(可选)
如果生成可执行文件时,需要用到第三方库的内容,而且前面已经添加了第三方库的搜索路径,那么我们可以让当前可执行文件(目标文件)与库文件建立连接。
######################################################
#
# target_link_libraries(<target_name> <library_name>)
#
######################################################
target_link_libraries(${PROJECT_NAME} test)
注意:链接库文件时,需要去掉前缀和后缀。
3、完整CMakeLists.txt
# 限制 cmake 最低版本为 3.0
cmake_minimum_required(VERSION 3.0)
# 为当前工程命名
project(tool_test)
# 引入头文件目录
include_directories(${PROJECT_SOURCE_DIR}/app1)
include_directories(${PROJECT_SOURCE_DIR}/vac/tool)
include_directories(${PROJECT_SOURCE_DIR}/3rd-part/include)
# 引入库文件搜索路径(可选)
link_directories(${PROJECT_SOURCE_DIR}/3rd-part/lib)
# 引入源文件
file(GLOB ALL_SOURCES
${PROJECT_SOURCE_DIR}/app1/*.cpp
${PROJECT_SOURCE_DIR}/vac/tool/*.cpp
)
# 生成可执行文件
add_executable(${PROJECT_NAME} ${ALL_SOURCES})
# 链接库文件
target_link_libraries(${PROJECT_NAME} test)