如何编写一个CMakeLists.txt文件(由简到难,较详细)

发布于:2024-08-13 ⋅ 阅读:(142) ⋅ 点赞:(0)

在Linux系统下,经常使用CMakeLists.txt文件来链接、编译C++工程,大部分人clone的代码里都是有CMakeLists.txt文件的,只需要cmake ..make就完事了,但在工作中,你必须要有从无到有编写CMakeLists.txt文件的能力。

一、简单CMakeLists.txt文件的编写

1.先看文件目录

在这里插入图片描述
在repository4文件夹下存在好几个C++相关的文件和一个CMakeLIsts.txt文件,文件清单如下表:

文件(夹)名 文件(夹)类型/用途
repository4 工程文件夹
calc.h 头文件,声明了几个函数定义
add.cpp/div.cpp/mult.cpp/sub.cpp 头文件中声明的函数的实现
test_calc.cpp 调用前面实现的几个函数
CMakeLists.txt 编写此文件,用于此工程的链接和编译

以上除CMakeLists.txt文件以外的文件自己在保证调用、语法、功能正确的前提下随便编写。

2.编写CMakeLists.txt文件

(1)编写简单CMakeLists.txt文件的流程

设置cmake的最低版本要求
指定C++标准
设置项目名称
搜索文件夹中源文件
添加头文件路径
生成可执行文件

(2)编写简单CMakeLists.txt文件

cmake_minimum_required(VERSION 3.16)  #cmake最低版本要求,不得高于你计算机安装的版本

set(CMAKE_CXX_STANDARD 11)  #指定C++标准

project(test_calculate)  #设置项目名称“test_calculate”

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)  #添加源文件到变量SRC中,宏PROJECT_SOURCE_DIR指的是正在编写的CMakeLists.txt文件所在的文件夹

include_directories(${PROJECT_SOURCE_DIR})  #制定头文件路径,${}符号是CMake语法中从变量取出变量的值的符号

add_executable(test_cacl ${SRC})  #使用源文件生成可执行文件test_cacl,源文件的路径及名称位于SRC变量中

这是非常简单的一个CMakeLists.txt文件,仅用于新手了解cmake的体验装

3.建立build文件夹,运行CMakeLists.txt文件,测试文件是否编写正确

建立build文件夹是为了保证源码文件的整洁,链接、编译生成的文件均在build文件夹下。

mkdir build  #在repository4文件夹下执行此命令生成build文件夹
cd build  #进入build文件夹
cmake ..  #使用CMakeLists.txt文件链接项目
make  #编译项目 生成可执行文件
./test_calc  #在编译正确后,运行生成的可执行文件test_calc

运行截图如下
在这里插入图片描述

4.稍微改进一下,显得整齐点

上面文件夹的内容显得比较凌乱,对其进行整理,整理后的文件目录如下,文件内容不变
在这里插入图片描述
将函数实现的cpp文件放在src目录下,将头文件放在include目录下
对应的CMakeLists.txt文件的内容如下

cmake_minimum_required(VERSION 3.16)

set(CMAKE_CXX_STANDARD 11)

project(test_calculate)

aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)  #修改

include_directories(${PROJECT_SOURCE_DIR}/include)  #修改

add_executable(test_cacl ${SRC} test_calc.cpp)  #修改

执行命令不变!

二、编写嵌套CMakeLists.txt文件

1.先看文件目录

在这里插入图片描述

在repository5文件夹下存在好几个C++相关的文件和一个CMakeLIsts.txt文件,文件清单如下表:

文件(夹)名 文件夹中的文件 文件(夹)类型/用途
repository5 以下文件(夹) 工程文件夹
build 链接、编译产生的文件 用于存放链接、编译时产生的文件
include calc.h / convert.h 头文件,声明了几个函数定义
calc calc.cpp / CMakeLists.txt 头文件calc.h中声明的函数的实现
conv conv.cpp / CMakeLists.txt 头文件convert.h中声明的函数的实现
test_calc test_calc.cpp / CMakeLists.txt 调用calc.cpp实现的几个函数
test_conv test_conv.cpp / CMakeLists.txt 调用conv.cpp实现的几个函数
CMakeLists.txt 编写此文件,用于此工程的链接和编译

这些文件总共生成两个可执行文件,一个是计算相关的calc,一个是转换大小写字母的conv,我们需要在实现头文件中声明的那些函数的源文件所在的文件夹调用头文件中函数的测试文件(main函数)所在的文件夹 以及 工程项目repository文件夹中创建CMakeLists.txt文件。
以上除CMakeLists.txt文件以外的文件自己在保证调用、语法、功能正确的前提下随便编写。

2.编写嵌套CMakeLists.txt文件

(1)编写嵌套CMakeLists.txt文件的流程
在这里插入图片描述
(2)编写外层CMakeLists.txt文件

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)
project(test)

#添加子文件夹
add_subdirectory(calc)
add_subdirectory(conv)
add_subdirectory(test_calc)
add_subdirectory(test_conv)

(3)编写内层CMakeLists.txt文件
a.编写calc文件夹中的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)
project(calc)

aux_source_directory(./ SRC)  # ./=${PROJECT_SOURCE_DIR},在当前CMakeLists.txt所在文件夹(calc)中搜索源文件,并放置在SRC变量中
include_directories(../include)  #添加头文件路径,../表示上一层目录,../include即在上一层目录下的include中
add_library(calculate STATIC ${SRC})  #取出SRC变量的值,生成一个名为calculate的静态库

b.编写test_calc文件夹中的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)
project(calculator)
aux_source_directory(./ SRC)
include_directories(../include)

link_libraries(calculate)  #链接生成的静态库
add_executable(calculator ${SRC})  #生成名为calculator的可执行文件

与calc相关的CMakeLists.txt就写好了

c.剩下的两个与conv相关的CMakeLists.txt文件其实与上面两个编写是一样的,只是更改一下相关名称而已,其内容如下:
conv文件夹中的CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)
project(conv)

aux_source_directory(./ SRC)
include_directories(../include)
add_library(convert STATIC ${SRC})

test_conv文件夹中的CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)
project(convertor)
aux_source_directory(./ SRC)
include_directories(../include)
link_libraries(convert)
add_executable(convertor ${SRC})

3.在项目文件夹下创建build文件夹,测试刚才编写的CMakeLists.txt文件

mkdir build
cd build
cmake ..
make
./test_conv/convertor

在这里插入图片描述

4. 同样改进一下,指定一下生成的库、可执行文件的存放目录

(1)在外层CMakeLists.txt文件中定义要存放生成的库、可执行文件的变量以及路径

set(LIBPATH ${PROJECT_SOURCE_DIR}/lib)  #设置生成库的路径,并放置在变量LIBPATH中
set(EXEPATH ${PROJECT_SOURCE_DIR}/bin)  #设置可执行文件的路径,并放置在变量EXEPATH中
#文件夹bin和lib会自动生成

(2)在内层CMakeLists.txt文件中使用上面两个全局变量LIBPATHEXEPATH

set(LIBRARY_OUTPUT_PATH ${LIBPATH})  #设置库的生成目录,在calc和conv文件夹下的CMakeLists.txt中添加
link_directories(../lib)  #设置要链接的库的目录,在test_calc和test_conv文件夹下的CMakeLists.txt中添加
set(EXECUTABLE_OUTPUT_PATH ${EXEPATH})  #设置可执行文件的生成目录,在test_calc和test_conv文件夹下的CMakeLists.txt中添加

(3)添加后在当前工程的build路径下执行以下命令来测试CMakeLists.txt文件

cmake ..
make
../bin/convertor  #当前在build文件夹中,bin文件夹和build并列,因此需要../

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到