【cmake学习】搭建一个简单的cmake工程(初级版)

         目录

1、工程框架介绍

2、编写CMakeLists.txt

(1) 限制cmake最低版本、工程命名

(2) 引入头文件目录

(3) 引入库目录(可选)

(4) 引入源文件

(5) 生成可执行文件 / 生成动静态库 

(6) 链接库文件(可选)

3、完整CMakeLists.txt


1、工程框架介绍

cmake搭建需要关注的是工程的整体架构,其实就是把你需要用到的文件都交给cmake管理。编译的时候,你的程序需要什么,cmake就给什么;如果没有程序要求的东西,cmake就会报错。

【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  ... ) 表示将列举的内容添加到变量中 
#
############################################################
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_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)

你可能感兴趣的:(Linux,基本命令和开发工具,C/C++,c++)