用CMake管理自己的程序(四)

本文介绍了如何使用CMake管理项目,重点在于使用target开头的命令来精细化管理编译选项,区分Debug与Release版本,以及如何为程序的Debug版添加后缀。内容涵盖target_include_directories、target_link_libraries等命令的使用,以及CMAKE_DEBUG_POSTFIX和DEBUG_POSTFIX属性的设置。

前言

用CMake管理自己的程序(一)
用CMake管理自己的程序(二)
用CMake管理自己的程序(三)
通过之前的文章,我们已经可以做到最基本的工程管理了,这篇文章,我们将对之前的工作做一个完善,让我们对程序的管理更加的合理。

target开头的命令

相信大家都注意到了,cmake是一个命令式的工具,其中,我们会发现一些功能相似的命令。
例如之前我们为了能够找到库的头文件,使用了include_directories命令,而现在我要介绍一个target开头的命令:target_include_directories命令。例子如下:
target_include_directories命令
从使用命令的目的上来说,这两个命令基本上没有任何区别,效果也是。都是指定目录,让编译时可以找到头文件。
然而,include_directories命令是一个全局命令,也就是在这个命令之后的所有代码中,包括子目录的项目中,也会增加该命令所指定的目录。顺带一提link_directories命令可以让之后所有的代码中,包括子目录的项目中,增加对应的库文件查找目录。
如果你的目标就是让所有的程序都包含一个指定的搜索目录,那么在总CMakeLists.txt中使用include_directories命令是没有问题的。但是,如果你的目标只是让一个指定的编译目标(通过add_executable或add_library指定的)而不是所有的目标包含特定的查找目录,那么你就应该考虑使用target_include_directories命令
事实上,所有针对特定编译目标的设置,都应该使用target开头的命令,比如target_compile_options命令。 这是一个使用target_compile_options命令设置输入文件编码的例子:
指定特定目标的编译标志
用这种方式就可以单独的指明test这个目标的输入编码是GBK而不会影响其它的目标。

这是cmake 3.19.2中所有target开头的命令,可以自行查看文档了解详细的用法

target_compile_definitions 
target_compile_features 
target_compile_options 
target_include_directories 
target_link_directories 
target_link_libraries 
target_link_options 
target_precompile_headers 
target_sources 

区分Debug与Release

相信大家使用第三方库的时候,一定会注意到大部分C++库都提供了Debug版与Release版,并且这两个版本的库可能在同一个目录下但是有不同的名字,也可能在不同的目录下但是有相同的名字。
无论是哪一种,当这个第三方库不提供cmake的包的时候,我们就需要手动指定当前要加载哪个库。此时,我们就需要能够区分Debug与Release。

一般情况下,target_link_libraries命令是最需要区分debug和release的,如果库的名称是一样的,但是放在了不同的目录下,那么我们可以直接这么写:
debug与release名称相同时
但是如果名称是不同的,那么我们就可以统一的设置搜索路径,然后只需要提供名称即可
debug与release名称不同时
对于没有debug和release区分的库或者提供了cmake包的库,我们可以不用关心,但是一旦有区分,我们就可以用debug和optimized区分debug库和非debug库(也就是release库)。
注意:依赖自己工程内部的库,可以不用区分debug和release,因为我们只要指定内部库的名称,cmake就会自动帮我们处

### 如何使用 Qt 和 CMake 管理程序结构 在现代软件开发中,使用 CMake 和 Qt 结合可以高效地管理复杂的程序结构。以下是如何通过 CMake 来组织和构建一个基于 Qt 的项目。 #### 1. 基础概念 CMake 是一个跨平台的构建工具,用于生成 Makefile 或工程文件,从而简化构建流程[^1]。Qt 提供了 qmake 工具来管理 Qt 项目的构建过程,但随着项目的复杂性增加,CMake 成为了更灵活的选择[^3]。 #### 2. CMakeLists.txt 文件配置 CMake 使用 `CMakeLists.txt` 文件来描述项目的结构和依赖关系。以下是配置 Qt 项目的基本步骤: - **设置最低版本要求** 首先需要指定 CMake 的最低版本要求,确保兼容性。 ```cmake cmake_minimum_required(VERSION 3.15) ``` - **定义项目名称** 定义项目的名称和编程语言。 ```cmake project(MyQtProject LANGUAGES CXX) ``` - **查找 Qt 模块** 使用 `find_package` 命令加载 Qt 模块。例如: ```cmake find_package(Qt5 COMPONENTS Core Widgets REQUIRED) ``` - **添加可执行文件** 使用 `add_executable` 添加主程序文件,并将源文件列出。 ```cmake add_executable(${PROJECT_NAME} main.cpp mainwindow.cpp mainwindow.h) ``` - **链接 Qt 库** 将 Qt 的库与目标链接起来。 ```cmake target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Widgets) ``` #### 3. 引入资源文件(qrc) 如果项目中有资源文件(如图片、图标等),可以通过 `qt5_add_resources` 命令将其编译为 C++ 代码[^2]。 ```cmake set(RESOURCES resources.qrc) qt5_add_resources(QRC_RESOURCES ${RESOURCES}) add_executable(${PROJECT_NAME} main.cpp mainwindow.cpp mainwindow.h ${QRC_RESOURCES}) ``` #### 4. 引入第三方库 若项目需要引入第三方库,可以使用 `link_directories` 或 `target_link_libraries` 来指定库路径和链接库文件[^5]。 ```cmake link_directories(/path/to/thirdparty/libs) target_link_libraries(${PROJECT_NAME} PRIVATE thirdpartylib) ``` #### 5. 组织多模块项目 对于大型项目,可以将不同功能模块分离到不同的子目录中,并通过 `add_subdirectory` 命令引入。 ```cmake add_subdirectory(modules/module1) add_subdirectory(modules/module2) ``` #### 6. 完善构建规则 通过 `target_*` 系列命令,可以进一步完善构建规则,例如指定头文件路径、编译选项等[^4]。 ```cmake target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include) target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra) ``` ### 示例代码 以下是一个完整的 `CMakeLists.txt` 示例: ```cmake cmake_minimum_required(VERSION 3.15) project(MyQtProject LANGUAGES CXX) # 查找 Qt 模块 find_package(Qt5 COMPONENTS Core Widgets REQUIRED) # 添加资源文件 set(RESOURCES resources.qrc) qt5_add_resources(QRC_RESOURCES ${RESOURCES}) # 添加可执行文件 add_executable(${PROJECT_NAME} main.cpp mainwindow.cpp mainwindow.h ${QRC_RESOURCES} ) # 链接 Qt 库 target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Widgets) # 引入第三方库 link_directories(/path/to/thirdparty/libs) target_link_libraries(${PROJECT_NAME} PRIVATE thirdpartylib) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值