cmake / cmake --build 如何理解

对于 cmake ,一直理解为项目构建工具,知道遇到 --build 才发现,cmake 还统一了各个平台的编译阶段。下面摘抄知乎上大神的理解:

简单说一下cmake项目构建过程:

1、首先,使用命令行:‘cmake <source tree>’,比如:cmake .. ,在你的构建目录(外部构建方式)下生成了项目文件 project files,官方文档中又叫 build tree / binary tree,这其中就包括,比如:Makefile,还有一些其他相关文件 / 目录 / 子目录。

2、其次,自然是对生成好的项目(project files)进行编译构建,使用到的就是你说的'cmake --build .'

3、最后,--build 后面的那个 ‘.’,指的是生成好的 build tree 的路径。一般来说,如果你明确知道,你的系统中使用的是哪种构建器(build generator), 比如:Unix Makefiles, 你完全可以直接使用 make 进行项目构建。对于这种 --build 的形式,多用于自动化脚本之中,或者 IDE 环境下。

注: <source tree>指的是源文件 + 顶层 CMakeLists 所在的路径,cmake .. 假设了路径在上一层。


作者:雨落惊风
链接:https://www.zhihu.com/question/63537567/answer/1723782096
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结来说,cmake 工作流程如下(当前目录为 CMakeLists.txt 所在的顶层目录):

1、构建项目

cmake . -Bbuild -G "Unix Makefiles"

2、编译项目

cmake --build build

在 linux 下就是执行 make 命令。 

3、说明 

-B        指定构建的项目文件所在的目录

-G        Generator 的意思,该语句可以设置 IDE,比如 Xcode

cmake 支持的 IDE 如下:

  • Borland Makefiles: 生成 Borland makefile。
  • MSYS Makefiles: 生成 MSYS makefile。

    生成的 makefile 用 use /bin/sh 作为它的 shell。在运行 CMake 的机器上需要安装msys。

  • MinGW Makefiles: 生成供 mingw32-make 使用的 make file。

    生成的 makefile 使用 cmd.exe 作为它的 shell。生成它们不需要 msys 或者 unix shell。

  • NMake Makefiles: 生成 NMake makefile。
  • NMake Makefiles JOM: 生成 JOM makefile。
  • Unix Makefiles: 生成标准的 UNIX makefile。

    在构建树上生成分层的 UNIX makefile。任何标准的 UNIX 风格的 make 程序都可以通过默认的 make 目标构建工程。生成的 makefile 也提供了 install 目标。

  • Visual Studio 10: 生成 Visual Studio 10 工程文件。
  • Visual Studio 10 Win64: 生成 Visual Studio 10 Win64 工程文件。
  • Visual Studio 6: 生成 Visual Studio 6 工程文件。
  • Visual Studio 7: 生成 Visual Studio .NET 2002 工程文件。
  • Visual Studio 7 .NET 2003: 生成 Visual Studio .NET 2003 工程文件。
  • Visual Studio 8 2005: 生成 Visual Studio .NET 2005 工程文件。
  • Visual Studio 8 2005 Win64: 生成 Visual Studio .NET 2005 Win64 工程文件。
  • Visual Studio 9 2008: 生成 Visual Studio 9 2008 工程文件。
  • Visual Studio 9 2008 Win64: 生成 Visual Studio 9 2008 Win64 工程文件。
  • Watcom WMake: 生成 Watcom WMake makefiles。
  • CodeBlocks - MinGW Makefiles: 生成 CodeBlock 工程文件。

    在顶层目录以及每层子目录下为 CodeBlocks 生成工程文件,生成的 CMakeList.txt 的特点是都包含一个 PROJECT() 调用。除此之外还会在构建树上生成一套层次性的 makefile。通过默认的 make 目标,正确的 make 程序可以构建这个工程。makefile 还提供了 install 目标。

  • CodeBlocks - NMake Makefiles: 生成 CodeBlocks 工程文件。

    在顶层目录以及每层子目录下为 CodeBlocks 生成工程文件,生成的 CMakeList.txt 的特点是都包含一个 PROJECT() 调用。除此之外还会在构建树上生成一套层次性的 makefile。通过默认的 make 目标,正确的 make 程序可以构建这个工程。makefile 还提供了 install 目标。

  • CodeBlocks - Unix Makefiles: 生成CodeBlocks工程文件。

    在顶层目录以及每层子目录下为CodeBlocks生成工程文件,生成的CMakeList.txt的特点是都包含一个PROJECT()调用。除此之外还会在构建树上生成一套层次性的makefile。通过默认的make目标,正确的make程序可以构建这个工程。makefile还提供了install目标。

  • Eclipse CDT4 - MinGW Makefiles: 生成 Eclipse CDT 4.0 工程文件。

    在顶层目录下为 Eclipse 生成工程文件。在运行源码外构建时,一个连接到顶层源码路径的资源文件会被创建。除此之外还会在构建树上生成一套层次性的 makefile。通过默认的 make 目标,正确的 make 程序可以构建这个工程。makefile 还提供了 install 目标。

  • Eclipse CDT4 - NMake Makefiles: 生成 Eclipse CDT 4.0 工程文件。

    在顶层目录下为 Eclipse 生成工程文件。在运行源码外构建时,一个连接到顶层源码路径的资源文件会被创建。除此之外还会在构建树上生成一套层次性的 makefile。通过默认的 make 目标,正确的 make 程序可以构建这个工程。makefile 还提供了 install 目标。

  • Eclipse CDT4 - Unix Makefiles: 生成 Eclipse CDT 4.0 工程文件。

    在顶层目录下为 Eclipse 生成工程文件。在运行源码外构建时,一个连接到顶层源码路径的资源文件会被创建。除此之外还会在构建树上生成一套层次性的 makefile。通过默认的 make 目标,正确的 make 程序可以构建这个工程。makefile 还提供了 install 目标。

(SAW:Game Over!)

 

 

<think>我们正在解决CMake报错:`include could not find requested file: D:/c++/Meta/cmake-build-debug/meta-targets.cmake`。错误信息如下: ``` CMake Error at D:/c++/Meta/cmake-build-debug/meta-config.cmake:34 (include): include could not find requested file: D:/c++/Meta/cmake-build-debug/meta-targets.cmake Call Stack (most recent call first): CMakeLists.txt:8 (find_package) ``` ### 错误原因分析 这个错误表明在`find_package`过程中,CMake尝试包含一个名为`meta-targets.cmake`的文件,但该文件在指定路径`D:/c++/Meta/cmake-build-debug/`下不存在。通常,这个文件是由被查找的包(这里是`meta`)通过CMake的导出机制生成的,但生成过程可能失败或未执行。 #### 详细原因: 1. **包导出文件缺失** `meta-targets.cmake`是CMake包配置文件(由`meta-config.cmake`)期望导入的目标文件。它应该在构建安装`meta`项目时生成。可能的原因包括: - `meta`项目未正确构建(例如,构建中断) - `meta`项目未安装(`install`步骤未执行) - 安装路径与`find_package`的搜索路径不匹配 2. **`find_package`的工作机制** `find_package(meta)`会尝试在特定路径下查找`meta-config.cmake`文件。一旦找到,该文件会被包含(include),然后它通常会尝试包含同目录下的`meta-targets.cmake`。如果`meta-targets.cmake`不存在,就会报错。 3. **路径分析** 错误中的路径`D:/c++/Meta/cmake-build-debug/`是`meta`项目的**构建目录**,而非安装目录。这表明: - 你可能尝试从构建目录直接导出包(未安装) -构建目录中缺少必要的导出文件 ### 解决步骤 #### 步骤1:确保`meta`项目已正确安装 在`meta`项目的构建目录中执行安装命令: ```bash # 在D:/c++/Meta/cmake-build-debug/目录中执行 cmake --build . --target install ``` 这会生成`meta-targets.cmake`并复制到安装目录(如`CMAKE_INSTALL_PREFIX`指定的路径)。 #### 步骤2:检查安装路径 如果步骤1成功,确认安装路径是否在`find_package`的搜索路径中: - 默认安装路径可能是`C:/Program Files/meta/`(Windows)或`/usr/local/`(Linux) - 在调用`find_package`前,通过`list(APPEND CMAKE_PREFIX_PATH "<安装路径>")`添加路径 #### 步骤3:验证导出文件存在 在安装目录下检查以下文件是否存在: ``` <安装路径>/lib/cmake/meta/meta-config.cmake <安装路径>/lib/cmake/meta/meta-targets.cmake ``` #### 步骤4:修复构建配置(如果未生成导出文件) 在`meta`项目的`CMakeLists.txt`中,确保包含导出目标: ```cmake # 在meta项目的CMakeLists.txt中添加 install(TARGETS my_meta_lib EXPORT meta-targets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION include ) # 生成并安装导出文件 install(EXPORT meta-targets FILE meta-targets.cmake NAMESPACE meta:: DESTINATION lib/cmake/meta ) ``` ### 常见错误场景 | 场景 | 现象 | 解决方案 | |------|------|----------| | 未执行安装 | 构建目录无`*-targets.cmake` | 执行`cmake --install` | | 安装路径未包含 | `find_package`找不到包 | 设置`CMAKE_PREFIX_PATH` | | 导出配置缺失 | 安装目录无导出文件 | 在包项目中添加`install(EXPORT)` | > **关键点**:`*-targets.cmake`必须由包项目显式生成并安装[^1]。 §§相关问题§§ 1. 如何正确设置CMake项目的导出目标? 2. `find_package`在哪些路径中搜索配置文件? 3. CMake中`CMAKE_INSTALL_PREFIX`的作用是什么? 4. 如何调试CMake包配置文件(`*-config.cmake`)的执行过程? </think> ### CMake 报错分析:`include could not find requested file: meta-targets.cmake` #### 错误原因分析 该错误的核心是 **CMake 配置文件缺失**,具体原因如下: 1. **包未正确安装**(最常见原因) `meta-targets.cmake` 是 CMake 包导出的核心文件,需通过 `install(EXPORT ...)` 命令生成。若 `meta` 项目未执行安装步骤,该文件不会生成: ```bash # 未执行安装命令 cmake --build . --target install # 缺失此步骤 ``` 2. **安装路径不匹配** `find_package()` 在 `D:/c++/Meta/cmake-build-debug/` 查找文件,但实际安装路径可能是: ```cmake # 默认安装路径(通常不在构建目录) set(CMAKE_INSTALL_PREFIX "C:/Program Files/meta") # 未配置指向构建目录 ``` 3. **导出配置缺失** `meta` 项目的 `CMakeLists.txt` 缺少导出声明: ```cmake # meta项目的CMakeLists.txt中缺失关键配置 install(EXPORT meta-targets # 必须存在此导出指令 FILE meta-targets.cmake DESTINATION lib/cmake/meta ) ``` 4. **构建中断** 编译过程可能因错误中断(如编译失败),导致导出文件未生成。 --- ### 解决方案 #### 步骤 1:确保 `meta` 项目正确安装 在 `meta` 项目的构建目录执行: ```bash # 重新生成并安装 cmake --build . --target install --config Release ``` > 验证安装目录(如 `C:/Program Files/meta`)是否存在 `lib/cmake/meta/meta-targets.cmake` #### 步骤 2:修正路径配置 在调用 `find_package` 的项目中,指定安装路径: ```cmake # 在调用方的CMakeLists.txt中添加 list(APPEND CMAKE_PREFIX_PATH "D:/c++/Meta/install") # 指向meta的安装目录 find_package(meta REQUIRED) # 现在会搜索正确路径 ``` #### 步骤 3:检查 `meta` 项目的导出配置 在 `meta` 项目的 `CMakeLists.txt` 添加: ```cmake # 添加导出目标(通常在定义目标后) install(TARGETS your_meta_library EXPORT meta-targets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib INCLUDES DESTINATION include ) # 生成导出文件 install(EXPORT meta-targets FILE meta-targets.cmake NAMESPACE meta:: DESTINATION lib/cmake/meta ) ``` #### 步骤 4:清理并重建 ```bash # 删除构建目录 rm -rf D:/c++/Meta/cmake-build-debug # 重新配置 cmake -S D:/c++/Meta -B D:/c++/Meta/cmake-build-debug -DCMAKE_INSTALL_PREFIX=安装路径 cmake --build D:/c++/Meta/cmake-build-debug --target install ``` --- ### 关键检查点 | 检查项 | 验证方法 | 解决措施 | |--------|----------|----------| | 安装步骤 | 执行 `cmake --install` | 添加安装命令 | | 安装路径 | 检查 `CMAKE_INSTALL_PREFIX` | 设置正确路径 | | 导出配置 | 查看 `meta` 的 `CMakeLists.txt` | 添加 `install(EXPORT)` | | 文件存在 | 手动检查 `meta-targets.cmake` | 重新安装 | > **提示**:95% 的此类错误是由于**未执行安装步骤**或**安装路径配置错误**导致[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值