Qt建的Cmake项目分文件编写,并在Qt上编译运行(超详细,只需怎CmakeLists.txt中加这两行)

一、Qt5的Creator中创建一个Cmake项目后会自动生成CMakeLists.txt文件和默认的头文件、源文件、ui文件。(这里比较简单,按Qt创建Cmake项目的步骤来就行)

二、在项目文件夹中创建src文件夹、include文件夹、ui文件夹,将默认的源文件、头文件、ui文件分别放入新建的文件夹中。

三、修改CMakeLists.txt文件(关键)

        1.更改编译文件的路径,在原来的基础上加文件夹名称

set(PROJECT_SOURCES
        src/main.cpp
        src/mainwindow.cpp
        include/mainwindow.h
        ui/mainwindow.ui
)

        2.添加头文件路径,让IDE能找到头文件,这样写代码时有提示且不会报错

include_directories(include)

        3. 添加ui文件生成的路径,用于编译后生成ui头文件

set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)

四、删除项目构建编译时产生的中间文件重新构建编译       

        完整的CMakeLists.txt如下,改动的地方也就只有三处

cmake_minimum_required(VERSION 3.5)

project(04_Layout VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include_directories(include)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)

set(PROJECT_SOURCES
        src/main.cpp
        src/mainwindow.cpp
        include/mainwindow.h
        ui/mainwindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(04_Layout
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET 04_Layout APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(04_Layout SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(04_Layout
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(04_Layout PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(04_Layout PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(04_Layout)
endif()
<think>好的,我现在需要回答用户关于CMakeLists.txt配置和构过程的问题。用户的问题是:“是要先配置好CMakeLists.txt后才能在编程器上创CMakeLists.txt编写cmake运行代码吗?” 看起来用户可能对CMake的工作流程有些混淆,特别是关于配置文件的创顺序和使用CMake的步骤。 首先,我需要明确用户的问题。用户似乎在问是否需要先配置好CMakeLists.txt文件,然后才能在编程器(可能是IDE或文本编辑器)中创文件编写代码,最后用CMake运行代码。可能存在一些误解,比如是否必须先配置CMakeLists.txt才能创它,或者是否CMake直接运行代码。 接下来,我需要理清CMake的基本流程。通常,使用CMake的步骤是:创源代码文件编写CMakeLists.txt来描述如何构这些代码,然后运行CMake生成构系统(如Makefile),最后使用生成的构系统(如make或ninja)来编译运行程序。用户可能混淆了配置文件和创文件的顺序,以及CMake的作用。 用户提到的“编程器上创CMakeLists.txt”可能指的是在IDE中手动创这个文件。实际上,CMakeLists.txt是需要用户自己编写的,通常在项目开始时就创,而不是在配置之后。也就是说,用户需要先创编写CMakeLists.txt,然后才能用CMake生成构文件。 可能用户的问题在于步骤的顺序是否正确。需要澄清的是,必须先有CMakeLists.txt,然后才能运行cmake命令。此外,用户可能对“运行代码”有误解,因为CMake本身运行代码,而是生成构系统,然后通过编译后的可执行文件运行代码。 接下来,我需要检查之前的对话历史。用户之前询问了关于ROS 2的C++开发流程,其中提到了配置CMakeLists.txt编译步骤。在之前的回答中,已经详细说明了如何编写CMakeLists.txt编译过程,但用户现在可能对具体的步骤顺序有疑问。 需要确保回答清晰,步骤说明正确的流程,纠正可能的误解。例如,指出必须先创和配置CMakeLists.txt,然后才能使用CMake生成构文件,之后进行编译运行。同时,需要区CMake编译工具(如make)的不同角色,以及运行代码是指执行编译后的可执行文件,而不是直接通过CMake运行。 还需要考虑用户可能对某些术语不熟悉,比如“生成构系统”或“编译工具链”,需要用更易懂的语言解释。此外,用户可能在尝试配置ROS 2项目时遇到问题,需要强调ROS 2中如何结合colcon和CMake来管理包。 最后,确保回答结构清晰,点说明,可能包括步骤、常见误区和示例,帮助用户逐步理解正确的流程。</think>--- ### **关键步骤解析:CMakeLists.txt的创与使用流程** 在C++项目开发中,`CMakeLists.txt`是**CMake系统**的核心配置文件。以下是正确的工作流程和常见问题解答: --- ### **1. **正确顺序:先编写CMakeLists.txt,再运行CMake** - **步骤说明**: 1. **手动创编写CMakeLists.txt** 你需要在项目根目录中**手动创**`CMakeLists.txt`文件编写规则(如指定编译器、添加源文件、链接库等)。 *这一步是开发者主动完成的,不是自动生成的。* 2. **运行CMake生成构系统** 在终端中执行`cmake`命令,CMake会根据`CMakeLists.txt`生成对应平台的构文件(如Makefile或Ninja文件)。 ```bash mkdir build && cd build cmake .. ``` 3. **编译代码** 使用生成的构系统(如`make`或`ninja`)编译代码,生成可执行文件或库。 ```bash make # 使用Makefile # 或 ninja # 使用Ninja ``` 4. **运行程序** 直接执行编译后的二进制文件: ```bash ./my_program ``` --- ### **2. **常见误区澄清** - **误区1**:认为CMake会自动生成CMakeLists.txt ✅ **纠正**:`CMakeLists.txt`必须由开发者手动创和配置,CMake本身不会生成该文件。某些IDE(如CLion)可能提供模板辅助生成,但核心内容仍需开发者编辑。 - **误区2**:混淆CMake编译器的角色 ✅ **纠正**: - CMake是**构系统生成器**,负责生成Makefile等文件。 - 编译器(如g++、clang)或构工具(如make、ninja)才是实际执行编译的命令。 - **误区3**:直接通过CMake运行代码” ✅ **纠正**:CMake不直接运行代码,它仅负责配置和生成构文件运行代码需先编译生成可执行文件,再手动执行。 --- ### **3. **ROS 2中的特殊流程** 在ROS 2开发中,流程略有不同,因为使用了`colcon`工具链(底层仍依赖CMake): 1. **创包时自动生成CMakeLists.txt** 通过`ros2 pkg create`命令创包时,ROS 2会生成一个基础的`CMakeLists.txt`模板,开发者只需在此基础上修改。 2. **编译时调用colcon** 无需手动运行`cmake`,直接使用`colcon build`,它会自动处理CMake配置、编译和安装。 ```bash cd ~/ros2_ws colcon build --packages-select my_pkg ``` 3. **运行节点** 通过`ros2 run`命令执行编译后的节点: ```bash ros2 run my_pkg my_node ``` --- ### **4. **操作示例:手动配置CMakeLists.txt** 假设有一个简单C++项目(非ROS 2): 1. **项目结构**: ``` my_project/ ├── CMakeLists.txt # 手动创 └── src/ └── main.cpp # 源代码 ``` 2. **CMakeLists.txt内容**: ```cmake cmake_minimum_required(VERSION 3.16) project(my_project) # 添加可执行文件 add_executable(my_program src/main.cpp) # 设置C++标准 set(CMAKE_CXX_STANDARD 17) ``` 3. **编译运行**: ```bash mkdir build && cd build cmake .. # 生成Makefile make # 编译 ./my_program # 运行 ``` --- ### **5. **常见问题排查** - **错误:CMakeLists.txt未找到** ✅ 确保文件命名为`CMakeLists.txt`(注意大小写),位于项目根目录。 - **错误:未声明源文件或依赖项** ✅ 检查`add_executable()`中是否包含所有源文件,链接库是否通过`target_link_libraries()`添加。 - **ROS 2中编译失败** ✅ 检查`package.xml`是否声明依赖,`CMakeLists.txt`中是否调用`ament_target_dependencies()`。 --- ### **总结** - **核心原则**:**先编写CMakeLists.txt,再运行CMake**。 - **关键区别**:CMake负责生成构系统,编译工具(如make)负责实际编译,最终通过可执行文件运行代码。 - **ROS 2简化流程**:利用`colcon build`自动化处理CMake步骤,但开发者仍需理解底层逻辑以便调试。 议通过简单非ROS项目练习CMake基础,再过渡到ROS 2开发,以加深理解!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值