cmake

1.概要

2.内容

CMake是一个跨平台的安装(编译)工具,它使用与平台和编译器独立的配置文件(CMakeLists.txt)来控制软件的编译过程。以下是关于CMake的详细介绍:

一、定义与功能

  • 定义:CMake是“cross platform make”的缩写,是一个跨平台的安装(编译)工具。它允许开发者用简单的语句来描述所有平台的安装(编译)过程。
  • 功能:CMake可以编译源代码、制作程序库、产生适配器(wrapper),还可以用任意的顺序建构执行档。它能测试编译器所支持的C++特性,类似于UNIX下的automake。

二、特点与优势

  • 跨平台性:CMake支持多种操作系统,包括Linux、POSIX相容的系统(如AIX、*BSD、HP-UX、IRIX、MinGW/MSYS、Solaris系统)、Mac OS X和微软Windows 95/98/NT/2000/XP等。
  • 灵活性:CMake支持in-place建构(二进档和源代码在同一个目录树中)和out-of-place建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。
  • 易用性:CMake通过CMakeLists.txt文件自动生成标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件。
  • 支持静态与动态程式库的建构:CMake支持静态与动态程式库的建构,满足不同项目的需求。

三、使用流程

  1. 编写CMakeLists.txt文件:CMake的核心就是CMakeLists.txt文件,它告诉CMake如何构建项目。通过CMakeLists.txt可以决定工程文件生成二进制文件、动态库、静态库文件,以及链接各种库文件。
  2. 运行CMake命令:在项目根目录下创建一个build文件夹,并在终端中进入该文件夹。然后运行cmake ..命令,这将使用根目录中的CMakeLists.txt文件来配置项目,并生成构建文件(如Makefile)。
  3. 编译项目:使用make命令(在Linux或Unix系统上)或相应的IDE命令来编译项目。这将根据生成的构建文件编译源代码,并生成可执行文件或库文件。

四、CMakeLists.txt文件的基本命令

  • CMAKE_MINIMUM_REQUIRED(VERSION 版本号):指定使用cmake的最低版本。
  • PROJECT(工程名):定义工程的名称。
  • ADD_EXECUTABLE(可执行文件名 所有需要用到的源文件):定义工程生成的可执行文件。
  • SET(变量名 值):定义一个变量并初始化其值。
  • INCLUDE_DIRECTORIES(所有头文件路径):指定头文件搜索路径。
  • ADD_LIBRARY(库名称 STATIC/SHARED 所有需要用到的源文件):生成静态库或动态库。
  • LINK_LIBRARIES(所有需要库文件):为程序链接所有需要的静态库。
  • LINK_DIRECTORIES(所有库文件的搜索路径):指定库文件(静/动态库)搜索路径。

五、CMake与Make的区别

  • 作用不同:CMake创建的输出可供Make等构建系统使用,它充当其他构建系统的生成器,并不负责实际编译。而Make的输出是可以在目标计算机上执行的已编译二进制文件。
  • 跨平台性:CMake是跨平台的,可以在不同的操作系统上运行。而Make是单平台的,通常与特定的操作系统和编译器绑定。
  • 用户界面:CMake附带一个GUI(cmake-gui),可用于配置项目。而Make是一个纯粹的命令行工具,不提供任何类型的GUI。

综上所述,CMake是一个强大的跨平台构建工具,它简化了软件构建过程,提高了开发效率。对于需要从源代码构建软件的开发人员或用户来说,CMake是一种快速简便的编译和安装方法。

3.关联链接

4.关联知识 

1.cmake 基本语法

CMake 是一个跨平台的自动化构建工具,通过编写 CMakeLists.txt 文件定义项目的编译规则。以下是 CMake 的基本语法和常用命令:


1. 基础结构

  • CMakeLists.txt:每个目录下必须有一个 CMakeLists.txt 文件,定义该目录的构建规则。
  • 项目声明

    cmake_minimum_required(VERSION 3.10) # 指定最低 CMake 版本
    project(MyProject LANGUAGES C CXX) # 声明项目名称和支持的语言

2. 添加可执行文件和库

  • 添加可执行文件
    add_executable(my_app main.cpp utils.cpp) # 生成名为 my_app 的可执行文件
  • 添加库

    add_library(my_lib STATIC src/lib.cpp) # 静态库(.a 或 .lib)
    add_library(my_lib SHARED src/lib.cpp) # 动态库(.so 或 .dll)

3. 变量与条件判断

  • 设置变量

    set(MY_VAR "value") # 定义变量
    message(${MY_VAR}) # 打印变量值
  • 条件判断

    if(WIN32)
        message("Windows 系统")
    elseif(UNIX)
        message("Unix/Linux/macOS 系统")
    endif()


4. 包含目录与链接库

  • 全局包含目录(不推荐,优先使用 target_*):
    include_directories(include) # 添加头文件搜索路径
  • 目标级包含目录(推荐):
    target_include_directories(my_app PRIVATE include) # PRIVATE 表示仅当前目标使用
  • 链接库
    target_link_libraries(my_app PRIVATE my_lib) # 链接库到目标

5. 子目录与外部项目

  • 包含子目录
    add_subdirectory(src) # 包含子目录的 CMakeLists.txt
  • 外部依赖(需 FindXXX.cmake 模块):

    find_package(OpenCV REQUIRED) # 查找 OpenCV 库
    target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})

6. 安装规则

  • 安装文件

    install(TARGETS my_app DESTINATION bin) # 安装可执行文件到 bin 目录
    install(FILES include/myheader.h DESTINATION include) # 安装头文件

7. 自定义命令

  • 生成文件

    add_custom_command(
        OUTPUT generated.cpp
        COMMAND python generate.py > generated.cpp
        DEPENDS generate.py
    )

8. 生成构建系统

在项目根目录执行:

cmake -B build -G "Unix Makefiles" # 生成 Makefile 到 build 目录
cmake --build build # 编译项目

示例:完整 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)


# 添加可执行文件
add_executable(my_app main.cpp)


# 包含头文件目录
target_include_directories(my_app PRIVATE include)


# 链接静态库(假设 libmylib.a 已存在)
target_link_libraries(my_app PRIVATE my_lib)


# 安装规则
install(TARGETS my_app DESTINATION bin)

注意事项

  1. 作用域:优先使用 target_* 命令(如 target_include_directories),而非全局设置。
  2. 现代 CMake:避免直接操作变量(如 CXX_FLAGS),改用 target_compile_options 和 target_compile_features
  3. 版本兼容性:不同 CMake 版本的语法可能不同,建议使用较新版本(如 3.16+)。

通过组合这些命令,可以灵活定义跨平台项目的构建流程。

2.qt 的工程源码是cmake 工程吗 

Qt 的工程源码同时支持 qmake 和 CMake 两种构建系统,但具体取决于 Qt 版本和模块。以下是详细说明:


1. 历史背景

  • 早期 Qt(Qt 4/5 早期版本)
    主要使用 qmake 作为官方构建工具,通过 .pro 文件定义项目结构。

  • Qt 5.15+ 和 Qt 6
    从 Qt 5.15 开始,官方逐步加强对 CMake 的支持,Qt 6 甚至将 CMake 列为首选构建系统,同时保留对 qmake 的兼容。


2. Qt 源码中的构建系统

  • CMake 支持
    Qt 的官方源码仓库(如 https://github.com/qt/qtbase)中包含完整的 CMakeLists.txt 文件,允许用户通过 CMake 构建整个 Qt 库或特定模块。

  • qmake 兼容性
    传统 .pro 文件仍然存在,但新功能可能优先通过 CMake 实现。


3. 如何选择构建工具?

  • 使用 CMake 构建 Qt

    # 生成构建系统(以 Unix Makefile 为例)
    cmake -B build -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/path/to/install
    
    
    # 编译并安装
    cmake --build build --target install
  • 使用 qmake 构建 Qt

    # 配置并生成 Makefile
    ./configure -prefix /path/to/install
    make -j4
    make install

4. 注意事项

  • 模块差异
    某些 Qt 模块(如 Qt WebEngine)可能对构建系统有特定要求,需参考官方文档。

  • 跨平台一致性
    CMake 在跨平台构建(如 Windows/macOS/Linux)中表现更统一,而 qmake 仍广泛用于传统项目。

  • 依赖管理
    CMake 通过 find_package(Qt6 COMPONENTS ...) 集成依赖,qmake 则通过 QT += ... 声明模块。


5. 推荐做法

  • 新项目
    优先使用 CMake,尤其是 Qt 6+ 项目,以利用现代 CMake 特性(如 target_link_librariestarget_include_directories)。

  • 维护旧项目
    可继续使用 qmake,但需注意 Qt 未来版本可能逐步减少对 qmake 的支持。


总结

Qt 的源码工程同时支持 qmake 和 CMake,但 CMake 是 Qt 6+ 的推荐构建系统。用户可根据需求选择工具,并通过官方文档(如 Build with CMake | Qt 6.9.1)获取详细配置指南。

3.qt 本身不也是给开发工具吗,开发qt使用的什么语言,工程是用的cmke对吗

Qt 本身是一个跨平台的应用程序开发框架,其核心实现和开发过程涉及以下关键点:


1. Qt 框架的开发语言

  • 核心实现
    Qt 框架的底层代码(如 Qt Core、Qt GUI 模块)完全用 C++ 编写,利用了 C++ 的高性能和面向对象特性。

  • 跨平台抽象
    Qt 通过封装不同操作系统(Windows、macOS、Linux 等)的 API,提供统一的 C++ 接口,使开发者无需直接处理平台差异。

  • 工具链扩展
    部分工具(如 Qt Creator IDE 的插件)可能使用 QML/JavaScript 或 Python 扩展功能,但核心框架仍是 C++。


2. Qt 框架的构建系统

Qt 官方源码工程同时支持 qmake 和 CMake,但根据版本不同,推荐策略如下:

版本推荐构建系统说明
Qt 4/5qmake传统构建工具,通过 .pro 文件定义项目,广泛用于旧版 Qt 代码库。
Qt 6CMake官方主推现代构建系统,通过 CMakeLists.txt 定义项目,支持更灵活的跨平台构建。

3. 开发 Qt 应用时的选择

  • 使用 Qt 框架开发应用
    开发者可以选择 CMake 或 qmake 构建自己的 Qt 项目,具体取决于团队习惯或项目需求。

    • CMake 示例(推荐 Qt 6+):

      cmake_minimum_required(VERSION 3.16)
      project(MyQtApp LANGUAGES CXX)
      
      
      find_package(Qt6 COMPONENTS Widgets REQUIRED) # 查找 Qt6 Widgets 模块
      
      
      add_executable(my_app main.cpp)
      target_link_libraries(my_app PRIVATE Qt6::Widgets) # 链接 Qt 库

      qmake 示例(传统方式):

      QT += widgets # 声明使用 Qt Widgets 模块
      SOURCES += main.cpp
  • Qt Creator IDE
    Qt 官方 IDE(Qt Creator)本身也是用 C++ 开发,并集成对 CMake 和 qmake 的支持,开发者可自由选择构建系统。


4. 关键总结

  1. Qt 框架的核心是 C++
    所有底层功能和跨平台抽象均通过 C++ 实现。

  2. 构建系统双轨制

    • 官方源码工程同时支持 qmake 和 CMake
    • Qt 6+ 优先推荐 CMake,以利用现代 CMake 特性(如跨平台一致性、依赖管理)。
  3. 开发者自由选择
    使用 Qt 开发应用时,可根据项目需求选择 CMake 或 qmake,但新项目建议采用 CMake 以兼容未来趋势。


5. 扩展:为何 Qt 转向 CMake?

  • 跨平台一致性
    CMake 在 Windows/macOS/Linux 上的行为更统一,减少平台适配成本。

  • 现代工作流支持
    CMake 天然支持包管理(如 FetchContent)、IDE 集成(如 CLion、VS Code)和持续集成(CI/CD)。

  • 社区趋势
    C++ 社区逐渐向 CMake 迁移,Qt 跟随这一趋势以保持技术领先。

通过以上解答,您应能清晰理解 Qt 的技术栈和构建系统选择逻辑。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值