【cmake学习】搭建一个简单的cmake工程(初级版)
1、工程框架介绍
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)