CMake构建项目

一、基本的CMake语法

标准的CMake工程结构应该是这样的:

  • CMakeLists.txt
    此CMakeLists.txt是顶层CMake文件,内容包括:

    #指定版本号
    CMAKE_MINIMUM_REQUIRED(VERSION 3.17.5)
    #指定工程名字,工程语言,定义了PROJECT( DIR ),则此CMake文件所在的目录会被视为全局变量PROJECT_SOURCE_DIR的值
    PROJECT(demo4 CXX)
    
    #添加源文件所在的目录
    ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/mylib)
    ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)
    
  • build
    build目录是编译工程文件,我们执行cmake命令生成makefile文件就是在此目录中,生成的内容都是中间文件和编译过后的二进制文件。build文件夹下应该包括bin和lib文件夹,bin文件夹中存放最终的可执行文件,lib文件夹下存放依赖库。
    我们会在此文件夹中执行:

    cmake ..
    #执行完上述命令后,就会生成makefile文件
    make
    #执行完上述命令后,就会编译链接源文件
    #进入build目录下盛放入口函数的目录下,一般是src目录,而后执行入口函数二进制文件
    
  • lib
    lib文件夹盛放库源代码文件,库文件的内容都在此文件夹内,此文件夹内的Cmake文件内容如下:

    #如果需要包含头文件,应该加上INCLUDE_DIRECTORIES(PATH)
    INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
    #设置生成的二进制库的存放位置位于build/lib
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    #将源文件添加进一个变量中
    AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
    #static参数指明是静态库,会在编译的时候将二进制代码嵌入最后唯一的可执行文件,
    #shared参数指明是动态库,编译的时候不会将二进制代码嵌入执行文件,而是生成一个二进制文件,在执行时再动态加载这个二进制文件供别的模块调用
    #此处生成了一个二进制库叫做Mylib
    ADD_LIBRARY(Mylib static/shared ${DIR_LIB_SRCS})
    
  • src
    src文件夹盛放项目的源文件,源文件的Cmake文件内容如下:

    #源文件可能会用到其他文件夹下的头文件,增加头文件寻找路径
    INCLUDE_DIRECTORIES(path)
    #设置产生的二进制文件放在bin文件夹中
    #PROJECT_BINARY_DIR的含义是在那个文件夹中执行cmake命令
    #哪个文件夹就是PROJECT_BINARY_DIR
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    #将当前文件夹下的源文件打包为DIR_SRCS变量
    AUX_SOURCE_DIRECTORY(./ DIR_SRCS)
    #将源文件编译为demo二进制文件
    ADD_EXECUTABLE(demo ${DIR_SRCS})
    #指明demo二进制文件需要链接的二进制库,此处Mylib正是我们在lib目录下的
    #CMake文件中定义的二进制库
    TARGET_LINK_LIBRARIES(demo Mylib)
    
  • include
    此文件夹存放头文件

二、自定义编译选项

通过ccmake实现自定义编译选项

一般情况下,使用宏来确定代码到底如何执行。
CMake支持在编译时动态调整宏。
具体而言:

  1. 假设有一个CMake文件:
    CMakeLists.txt

    OPTION(TEST "define for TEST" ON)
    
    #假设PATH1代表一个文本文件,PATH2代表根据此文本文件生成的头文件
    CONFIGURE_FILE("PAHT1" "PATH2")
    
  2. 假设有PATH1指代的文本文件:

    #cmakedefine TEST
    
  3. 执行cmake .
    会生成PATH1对应的文本文件指定的头文件
    这其中的过程是这样的:
    OPTION中定义的变量TEST和PATH1文件中指定的宏TEST绑定,因为我们默认TEST为ON,所以宏TEST被定义了
    生成的头文件内容为:

    #define TEST
    

    这个头文件可以被其他文件包含,一旦被包含,也就相当于包含了#define TEST,TEST就被宏定义了。我们在源文件中可以通过

    #ifdef TEST
    	xxx
    #else
    	xxx
    #endif
    

    来指定执行部分代码。

  4. 以上我们通过一个OPTION命令指定了头文件中有TEST的宏定义。如何让TEST没有宏呢?
    执行ccmake .
    弹出的界面中使用方向键上下选择宏,回车改变宏的值,ON为开启,OFF为关闭。
    修改完后,按c键保存配置,再按g键生成新的头文件。
    之后重新执行make命令,就可以用新生成的头文件去重新编译代码。

  5. 一般情况下,把所有开关放在options.txt文件中,在顶层CMakeLists.txt文件中使用INCLUDE执行将开关内容包含进来。

  6. 在执行cmake命令的时候,可以通过-Dxxx=ON/OFF来指定宏开关一开始对应的值。

三、使用CMake和VScode搭建Debug环境

  1. 在顶层CMakeLists.txt中添加:

    ADD_DEFINITIONS(-std=c++11)
    SET(CMAKE_BUILD_TYPE "Debug")
    
    #debug模式编译,参数-O0表示完全不进行代码优化 -Wall表示打印警告信息
    #调试的选项:
    #-g 调试信息由系统生成,但是gdb可以合理封装使用
    #-ggdb 专门为gdb生成调试信息
    #-g3 调试级别更高,3级别可以调试宏
    #-ggdb3 调试级别为3,且专门为gdb调试器生成调试信息
    SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb")
    SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
    
  2. 在VScode文件夹下,点击运行——调试——C++(DLL/GDB)

  3. 对2中生成的launch.json配置文件,修改以下内容

    "program": "${workspaceFolder}/build/bin/demo6",
    

    关于${workspaceFolder},此变量指向的是.vscode文件夹所在的目录

四、 搭建简易工程

建立工程项目目录如下:
在这里插入图片描述
顶层CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.17.5)

project(Test CXX)

#源文件所在子目录
ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)

src/CMakeLists.txt文件:

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/out)

AUX_SOURCE_DIRECTORY(./ DIR_SRCS)

ADD_EXECUTABLE(main ${DIR_SRCS})

执行过程:

  1. 头文件一律放在include文件夹

  2. 源文件一律放在src文件夹

  3. 到build文件夹中执行:

    #执行之前可以通过:
    scl --list  获取从scl安装的gcc各版本
    scl enable devtoolset-11 bash  可以使用最新版本的gcc作为编译器
    
    cmake ..		->通过顶层CMakeLists.txt文件构建makefile
    make			->执行makefile文件,构建项目
    
  4. 项目的输出文件在build/out文件夹下,一个名为main的可执行文件。

  5. 让简易工程处于可调式模式
    在顶层CMakeLists.txt文件中添加以下内容

    SET(CMAKE_BUILD_TYPE "Debug")
    SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb")
    SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
    

    重新cmake,make,生成的可执行文件就是可调试的。
    如果不想调试,则将SET(CMAKE_BUILD_TYPE “Debug”)中的"Debug"修改为“Release”,而后重新cmake,make便可。
    【注1】调试需要安装gdb,配置gdb的环境变量。
    【注2】在vscode中,可以使用launch.json文件配置调试,过程如下:

    1. 删除task.json,因为此文件是配置编译动作的文件。
    2. 将launch.json的“prelaunchtask”参数对应选项删除,这是删除了执行调试前编译工作,因为我们已经使用了CMake编译了工程。
    3. 将launch.json中"program": 后的参数为**"${workspaceFolder}/build/out/main"**,针对我们生成的main可执行文件进行调试
    4. 将launch.json 中的 “miDebuggerPath”:后的参数改为gdb的地址(如果有环境变量,可以直接填写gdb)
    5. 如果添加了新的源文件或者删除了原有的源文件,则可在被修改文件目录中把其对应的CMakeLists.txt文件中添加或者删除一个空格。然后直接make就可以重新编译整个工程,并且编译整个工程的时候可以利用以前的已经编译好的文件。
    6. 为什么?假装修改了CMakeLists.txt文件后,执行make,因为生成的makefile顶层文件中实际的项目目标main,是依赖于CMakeLists.txt项目的,所以一旦修改了CMakeLists.txt再执行make命令,就可以重新解析CMakeLists.txt,从而改变我们正在执行的makefile文件,给makefile文件增添或者减少子目标文件。依赖项CMakeLists.txt执行完成后,开始执行工程文件编译,但是因为已经修改了makefile,则会按照新的makefile来编译。但是因为没有改变原来的makefile缓存目录,所以就针对新添加的文件或者修改的文件进行重新编译,而其他未涉及到的源文件则不需要重新编译。

五、 修改文件之后cmake还是make?

修改了CMakeLists.txt文件,就把build文件夹下的CMakeChache.txt文件删掉,然后重新cmake,重新make。
如果修改的是源文件或者头文件,则直接make就可以。
<think>好的,用户想了解如何在Qt Creator中使用CMake构建项目。首先,我需要确认用户对Qt Creator和CMake的基础了解程度。可能用户已经知道Qt Creator是一个集成开发环境,主要用于Qt应用程序的开发,而CMake是一个跨平台的构建系统生成工具。但为了全面,我应该先简要介绍这两个工具,然后再详细讲解如何在Qt Creator中结合使用它们。 接下来,我应该分步骤说明。首先是如何创建新项目,选择CMake作为构建系统。这里需要详细说明Qt Creator中的各个选项,比如项目类型、路径设置、CMake配置参数等。同时,可能需要提醒用户安装CMake和Qt的相关组件,避免出现环境问题。 然后,项目结构部分需要解释CMakeLists.txt文件的作用,以及Qt Creator如何解析这些文件来生成项目结构。用户可能对CMake语法不太熟悉,所以需要简单说明关键指令,比如cmake_minimum_required、project、find_package、add_executable和target_link_libraries,并举例说明它们在Qt项目中的应用。 在构建配置方面,用户可能需要了解如何在Qt Creator中调整CMake的设置,比如指定构建目录、选择构建类型(Debug/Release)以及传递额外的CMake参数。这部分需要指导用户如何在图形界面中操作,同时解释每个设置的影响。 关于调试和运行,需要说明如何设置启动配置,包括选择可执行文件和添加命令行参数。这部分相对简单,但用户可能会遇到路径问题,所以提醒他们检查构建目录是否正确。 高级部分可能需要涵盖如何管理多个构建套件、处理第三方库、自定义构建步骤以及调试CMake文件本身。这些内容对于有一定经验的用户可能更有帮助,但需要保持解释的清晰度,避免过于复杂。 用户可能的疑问包括如何处理CMake的错误,或者如何集成非Qt的库。因此,在常见问题中,我应该提到检查CMake输出、确保路径正确,以及使用find_package和target_link_libraries来链接库。 最后,总结部分需要强调Qt Creator和CMake结合的优势,比如跨平台支持和灵活性,并鼓励用户查阅官方文档以深入理解。同时,保持整体结构的逻辑性,让用户能够一步步跟随操作,从创建项目到高级配置都有所了解。 需要避免使用过于专业的术语,或者至少在使用时给出简单解释。确保每个步骤都清晰,可能的问题都有提示,这样用户即使遇到困难也能找到解决方法。另外,考虑到用户可能使用不同操作系统,所以在路径和命令上要通用,或者指出不同系统的差异。 检查是否有遗漏的步骤,比如安装CMake和Qt的注意事项,或者在配置CMake时可能需要的环境变量设置。确保覆盖所有关键点,让用户能够顺利在Qt Creator中使用CMake构建项目。</think>在 Qt Creator 中使用 CMake 构建项目是开发 Qt 应用程序的常见方式,尤其是在现代 Qt 版本中(Qt 6 开始默认推荐 CMake)。以下是详细操作指南: --- ### **1. 环境准备** - **安装 Qt Creator**:确保安装时勾选 CMake 支持组件(通常默认包含)。 - **安装 CMake**:建议使用较新版本(至少 CMake 3.16+),可在[官网下载](https://cmake.org/download/)或通过包管理器安装。 - **安装 Qt 库**:选择所需的 Qt 版本(如 Qt 6.x),安装时勾选对应平台的 CMake 支持文件。 --- ### **2. 创建 CMake 项目** 1. **新建项目**: `文件 → 新建文件或项目 → 其他项目CMake Project → 选择路径 → 输入项目名称` 2. **配置 CMake**: - 指定 `CMakeLists.txt` 文件路径(通常自动生成)。 - 设置构建目录(默认在项目路径下的 `build` 文件夹)。 - 选择构建套件(Kit):如 `Desktop Qt 6.x.x MinGW 64-bit`。 3. **完成创建**:Qt Creator 会自动生成一个基础的 `CMakeLists.txt` 和 `main.cpp` 文件。 --- ### **3. 项目结构解析** #### **关键文件 `CMakeLists.txt`** ```cmake cmake_minimum_required(VERSION 3.16) # 最低 CMake 版本 project(MyProject LANGUAGES CXX) # 项目名称和语言 # 查找 Qt 库(必须包含的模块) find_package(Qt6 COMPONENTS Core Widgets REQUIRED) # 添加可执行文件 add_executable(MyApp main.cpp) # 链接 Qt 库到目标 target_link_libraries(MyApp PRIVATE Qt6::Core Qt6::Widgets) # 自动处理 Qt 的元对象(如信号槽) set_target_properties(MyApp PROPERTIES AUTOMOC ON AUTORCC ON AUTOUIC ON ) ``` --- ### **4. 配置与构建** - **修改 CMake 参数**: 在项目侧边栏的 `项目构建设置 → CMake` 中,可添加参数(如 `-DCMAKE_BUILD_TYPE=Debug`)。 - **构建项目**: 点击左下角的 `构建` 按钮(或 `Ctrl+B`),输出结果在构建目录中。 - **清理构建**: `构建 → 清理项目` 或手动删除 `build` 目录。 --- ### **5. 调试与运行** - **运行程序**:点击左下角 `运行` 按钮(或 `Ctrl+R`)。 - **调试程序**:点击 `调试` 按钮(或 `F5`),需确保构建类型为 `Debug`。 - **配置启动项**: 在 `项目 → 运行` 中,可设置命令行参数或环境变量。 --- ### **6. 添加 Qt 模块** 若需使用更多 Qt 功能(如 QML、网络等): 1. 在 `CMakeLists.txt` 的 `find_package` 中添加模块: ```cmake find_package(Qt6 COMPONENTS Core Widgets Gui Qml Network REQUIRED) ``` 2. 链接到目标: ```cmake target_link_libraries(MyApp PRIVATE Qt6::Core Qt6::Widgets Qt6::Qml) ``` --- ### **7. 常见问题解决** #### **问题 1:CMake 找不到 Qt** - 检查 `Kit` 配置:`工具 → 选项 → Kits`,确认 CMake 路径和 Qt 版本正确。 - 确保 `find_package` 中的 Qt 版本(如 `Qt6`)与实际安装一致。 #### **问题 2:构建失败提示缺失头文件** - 确认是否链接了正确的 Qt 模块。 - 检查 `CMakeLists.txt` 中是否启用 `AUTOMOC`(自动生成元对象代码)。 #### **问题 3:QML 文件无法加载** - 添加 `Qt6::Quick` 模块,并设置资源文件路径: ```cmake qt_add_resources(MyApp "qml" PREFIX "/" FILES main.qml ) ``` --- ### **8. 高级配置** - **添加第三方库**: 使用 `find_package` 或 `add_subdirectory` 引入外部依赖。 - **自定义构建步骤**: 在 `CMakeLists.txt` 中使用 `add_custom_command` 或 `add_custom_target`。 - **多目标管理**: 通过 `add_subdirectory` 管理多个子项目。 --- ### **总结** Qt Creator + CMake 的组合提供了更灵活的构建方式,尤其适合跨平台项目。熟练掌握 `CMakeLists.txt` 的编写和 Qt Creator 的调试工具,可以显著提升开发效率。遇到问题时,建议优先查阅 [Qt 官方文档](https://doc.qt.io/)和 [CMake 官方教程](https://cmake.org/cmake/help/latest/)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值