编写自己的CMakeLists.txt
1. 一个CMakeLists.txt的基本内容
# 编译本项目的cmake的版本要求
cmake_minimum_required(VERSION 3.3.0)
# 项目名称,自己设
project(<projectName>)
# cmake编译时是以Debug还是Release形式编译
set(CMAKE_BUILD_TYPE Release)
# 设置要求的c++标准,cmake v3.1及以上版本支持这种方式
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 如果是低版本的cmake,需要以下面这种方式设定:
# include(CheckCXXCompilerFlag)
# CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
# 设置c++标准这一部分想要具体了解的话可以参考[这篇博客](https://blog.csdn.net/zhizhengguan/article/details/124690878)
# 设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 设置库文件的输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 以上两变量在新版本中已被`CMAKE_RUNTIME_OUTPUT_DIRECTORY`和`CMAKE_ARCHIVE_OUTPUT_DIRECTORY`代替
# 提供搜索头文件的路径,根据自己项目设定包含头文件的路径
include_directories(${CMAKE_SOURCE_DIR}/include)
#生成可执行文件目标,这里用主目录下的main.cpp演示,项目中的其他文件添加也同理,后面会展示一种更方便的方式
add_executable(<name> ${CMAKE_SOURCE_DIR}/main.cpp)
# 为目标链接到对应的库,target是add_executable生成的目标,即需要与其同名
# item是要链接的库文件的名称,后面通过示例展示
# 注意:target_link_libraries必须在add_executable之后
target_link_libraries( <target>
[item1]
[item2]
...
)
2. 项目包含多个文件或文件夹时添加方式
通常一个项目会有很多个cpp文件,或者多个文件夹,每个文件夹下有多个文件便于代码管理,这时候总不能去手敲每个文件的路径到add_executable()
里面去。
(网上很多教程就只拿只有一个main.cpp的举例,你家项目只有一个main文件啊?)
例如项目下还包含一个文件夹Part1
,里面有很多cpp文件,这时候可以通过FILE
生成一个这些文件的总目录,然后直接加到add_executable()
即可
方式如下:
FILE(GLOB_RECURSE part1_files "${CMAKE_SOURCE_DIR}/Part1/src/*.cpp")
# 其中GLOB_RECURSE参数是用于递归搜索目标文件夹下的所有文件以及子文件夹
# part1_files 是自己设定的名称
# 第三个参数是自己的文件路径
生成总目录后,再在add_executable()
进行添加即可:
add_executable(<name> ${CMAKE_SOURCE_DIR}/main.cpp ${part1_files})
项目文件结构示例
.
├── bin
├── build
├── include
├── Part1
│ ├── include
│ └── src
│ ├── a.cpp
│ ├── b.cpp
│ └── ...
├── lib
├── main.cpp
├── opencv
│ ├── include
│ │ ├── opencv
│ │ └── opencv2
│ └── lib
│ ├── libopencv_world.so
│ ├── libopencv_world.so.3.4
│ └── libopencv_world.so.3.4.16
└── CMakeLists.txt
3. 添加链接库
当项目下有要使用的库时,这里以linux下的opencv动态链接库文件举例
# 设定路径变量,方便书写
set(myOpenCV_Path ${CMAKE_SOURCE_DIR}/opencv)
# 添加头文件,同第一部分的说明
include_directories(${myOpenCV_Path}/include)
# 设定.so文件的路径变量
set(OpenCV_LIBS ${myOpenCV_Path}/lib/libopencv_world.so)
# 设定完路径变量后,再在target_link_libraries中添加即可
target_link_libraries( <target>
${OpenCV_LIBS}
...
)
注:添加链接库这一部分如果出现添加失败或者切换库版本切换不过去可以参考 这篇博客
本文只记录了最基础的所需项,有了这些一般简单的项目都能够正常编译运行了,CMakeLists.txt当然还有更多更灵活高级的写法和东西,例如install之类的,根据项目需求自行添加,后续学习到了再进行记录