CMakeLists.txt文件中的语法规则用于指定如何编译和链接应用程序和库

2024-01-07 18:46:05


CMake 是一个跨平台的自动化构建系统,它使用 CMakeLists.txt 文件来定义构建过程。 CMakeLists.txt 文件中的语法规则用于指定如何编译和链接应用程序或库。下面是一些基本的 CMakeLists.txt 语法规则汇总:

1. 最低版本要求

指定 CMake 的最低版本要求。声明要求的cmake最低版本,终端输入cmake -version可查看cmake的版本

cmake_minimum_required(VERSION 3.10)

2. 项目名称

设置项目名称,并可选地指定项目版本。

project(MyProject VERSION 1.0)

3. 设置 C++ 标准

指定 C++ 的标准版本。

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set( CMAKE_CXX_COMPILER "g++")

设置使用g++编译器,这是添加变量的用法set(KEY VALUE)接收两个参数,用来声明变量。在camke语法中使用${KEY}这种写法来取到VALUE

set( CMAKE_BUILD_TYPE "Release" )

设置cmake编译模式有debug和release两种PROJECT_SOURCE_DIR项目根目录也就是是CmakeLists.txt的绝对路径

set( CMAKE_CXX_FLAGS “-std=c++11 -march=native -O3”)

参数CMAKE_CXX_FLAGS含义是: set compiler for c++ language
添加c++11标准支持,-march=native指定目标程序的cpu架构来进行程序优化
native相当于自检测cpu,-march是优化选项,后面的-O3编译器的优化等级标志,是用来调节编译时的优化程度的,最高为-O3,最低为-O0即不做优化,但有时候这种优化可能会增加编译时间和生成的二进制文件的大小。
-Ox这个参数只有在CMake -DCMAKE_BUILD_TYPE=release时有效
因为debug版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版的不需要调试信息但需要优化

4. 添加可执行文件

添加一个可执行文件,指定源代码文件。

add_executable(MyApp main.cpp)

5. 添加库文件

添加库(静态或动态),指定源代码文件。

add_library(MyLib STATIC library.cpp)
# 或者使用 add_library(MyLib SHARED library.cpp) 为动态库

6. 包含目录

指定头文件的搜索路径。

include_directories(include)

7. 链接库

指定目标和要链接的库。

target_link_libraries(MyApp PRIVATE MyLib)

8. 添加子目录

包含子目录,该目录下应该也有一个 CMakeLists.txt 文件。也就是进入源代码文件夹继续构建。

add_subdirectory(subdir)
add_subdirectory(${PROJECT_SOURCE_DIR}/src)

9. 设置变量

设置一个变量。

set(SOURCE_FILES main.cpp util.cpp)

设定生成的可执行二进制文件存放的存放目录

set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

设定生成的库文件的存放目录

set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(use_test ${SOURCES_DIRECTORY}/user_accounts.cpp)
message("use_test : ${use_test}")

调试手段message打印信息,类似于echo/printf,主要用于查cmake文件的语法错误

10. 条件语句

基于条件执行命令。

if(WIN32)
    # Windows 特定的设置
endif()

11. 安装规则

设置安装规则,指定如何安装构建的目标。

install(TARGETS MyApp DESTINATION bin)
set(CMAKE_INSTALL_PREFIX < install_path >)

在CMakeLists.txt中指定安装位置
在编译终端指定安装位置:cmake -DCMAKE_INSTALL_PREFIX=/usr ..

12. 测试

添加测试。

enable_testing()
add_test(NAME MyTest COMMAND MyApp)

13. 定制构建类型

设置不同的构建类型和相应的编译器选项。

set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

14. 导入外部库

找到并使用外部库。

find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(MyApp PRIVATE ${Boost_LIBRARIES})

去寻找该库的头文件位置、库文件位置以及库文件名称,并将其设为变量,返回提供给CMakeLists.txt其他部分使用。
cmake_modules.cmake文件是把CMakeLists.txt里用来寻找特定库的内容分离出来,如果提示没有找到第三方依赖库可以尝试安装或者暴力指定路径。

在CMakeLists.txt中使用第三方库的三部曲:find_package、include_directories、target_link_libraries

include_directories(${OpenCV_INCLUDE_DIRS})// 去哪里找头文件
link_directories()// 去哪里找库文件(.so/.lib/.ddl等)
target_link_libraries( ${OpenCV_LIBRARIES})// 需要链接的库文件
message("OpenCV_INCLUDE_DIRS: \n" ${OpenCV_INCLUDE_DIRS})
message("OpenCV_LIBS: \n" ${OpenCV_LIBS})
find_package(Eigen3 REQUIRED)

假如找不到Eigen3库,我们就设置变量来指定Eigen3的头文件位置

set(Eigen3_DIR /usr/lib/cmake/eigen3/Eigen3Config.cmake)
include_directories(/usr/local/include/eigen3)

总结

CMakeLists.txt 文件是 CMake 构建系统的核心,它使用一系列命令来指定如何编译和链接项目。通过正确使用这些命令,可以创建灵活且强大的构建脚本来适应各种不同的项目需求。

文章来源:https://blog.csdn.net/qq_21950671/article/details/135441696
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。