news 2026/7/27 10:15:55

CMake几个命令顺序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake几个命令顺序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • 关键顺序规则:
      • 示例说明
      • 顺序解释:
      • 错误顺序的后果:

在 CMake 中,target_include_directoriestarget_link_directoriesadd_librarytarget_link_libraries的使用存在明确的先后顺序,核心原则是:先创建目标(add_library),再配置目标的属性(target_include_directoriestarget_link_directories),最后链接依赖(target_link_libraries。同时,被链接的目标(如库)必须在链接命令之前创建。

关键顺序规则:

  1. add_library必须最先执行:因为target_*系列命令(包括target_include_directoriestarget_link_directoriestarget_link_libraries)的操作对象是“目标”(如库或可执行文件),必须先通过add_library(或add_executable用于可执行文件)创建目标,否则 CMake 会报错“目标不存在”。
  2. target_include_directoriestarget_link_directories需在目标创建后、链接前执行:这两个命令是给目标设置“编译时头文件路径”和“链接时库路径”,需要在目标被链接(target_link_libraries)前完成配置,否则可能导致编译或链接时找不到路径。
  3. target_link_libraries需在被链接的目标创建后执行:如果要链接的是通过add_library创建的自定义库,必须先通过add_library生成该库目标,再用target_link_libraries链接,否则会找不到依赖库。

示例说明

假设一个工程结构如下(多模块项目,包含一个自定义库mylib和一个依赖它的可执行文件myapp):

project/ ├── CMakeLists.txt ├── include/ # 公共头文件目录 │ └── mylib.h ├── src/ │ ├── mylib.cpp # 库的源文件 │ └── main.cpp # 可执行文件的源文件

对应的CMakeLists.txt正确顺序如下:

# 1. 最低版本要求(必须在 project 前) cmake_minimum_required(VERSION 3.10) # 2. 定义项目 project(MyProject LANGUAGES CXX) # -------------------------- # 步骤1:创建库目标(add_library 必须先执行) # -------------------------- add_library(mylib STATIC src/mylib.cpp # 库的源文件 ) # -------------------------- # 步骤2:配置库的头文件路径(target_include_directories 在目标创建后) # -------------------------- # 为 mylib 设置头文件目录,PUBLIC 表示依赖 mylib 的目标(如 myapp)会自动继承该路径 target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include # 公共头文件目录 ) # -------------------------- # 步骤3:创建可执行目标(依赖 mylib,需在链接前创建) # -------------------------- add_executable(myapp src/main.cpp # 可执行文件的源文件 ) # -------------------------- # 步骤4:(可选)配置可执行文件的链接路径(如果有额外库路径) # -------------------------- # 假设 myapp 还需要链接第三方库,其路径在 ./third_party/lib target_link_directories(myapp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib ) # -------------------------- # 步骤5:链接依赖库(target_link_libraries 在被链接目标创建后) # -------------------------- # 让 myapp 链接自定义库 mylib(mylib 已通过 add_library 创建) # 同时链接第三方库(如 pthread 或其他) target_link_libraries(myapp PRIVATE mylib # 自定义库(必须先通过 add_library 创建) pthread # 系统库(无需提前创建) )

顺序解释:

  1. add_library(mylib ...)先执行:创建库目标mylib,后续的target_include_directories(mylib ...)才能操作这个目标。
  2. target_include_directories(mylib ...)紧随其后:为mylib设置头文件路径,由于用了PUBLIC,后续依赖mylibmyapp会自动继承这个路径(无需再给myapp重复设置include目录)。
  3. add_executable(myapp ...)创建可执行目标myapp是最终要生成的程序,必须先创建才能对其配置链接路径和依赖。
  4. target_link_directories(myapp ...)配置链接路径:如果myapp需要链接额外的第三方库,需在链接前指定其路径(否则链接器可能找不到库文件)。
  5. target_link_libraries(myapp ...)最后链接:此时mylib已存在,myapp的链接路径也已配置,链接操作才能正常执行。

错误顺序的后果:

  • 如果在add_library(mylib)之前调用target_include_directories(mylib ...),CMake 会报错:Cannot specify include directories for target "mylib" which is not built by this project(目标不存在)。
  • 如果在add_library(mylib)之前调用target_link_libraries(myapp mylib),CMake 会报错:Target "myapp" links to target "mylib" which is not built by this project(被链接的目标不存在)。

因此,严格遵循“先创建目标 → 再配置属性 → 最后链接依赖”的顺序是保证 CMake 脚本正确执行的基础。。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 13:37:39

Keil5中文乱码调试技巧:项目应用总结

Keil5中文注释乱码?一文讲透根源与实战解决方案在嵌入式开发的日常中,你是否也遇到过这样的场景:刚写完一段逻辑清晰、注释详尽的C代码,满怀信心地打开Keil Vision5(简称Keil5)准备调试,结果——…

作者头像 李华
网站建设 2026/7/17 15:23:22

板对板连接器解决方案:覆盖消费电子、汽车、工业全领域

随着全球电子设备向更高集成度、更强性能演进,板对板连接器作为实现电路板间可靠互连的金桥,其重要性日益凸显。市场数据显示,全球板对板连接器市场预计在2025年达到124.2亿美元,并将在2030年增长至160.5亿美元,展现出…

作者头像 李华
网站建设 2026/7/24 21:39:06

分享一个负载均衡的NDB高可用集群架构+部署详细说明

部署说明: 1个管理节点 :192.168.10.61 2个SQL 节点 :192.168.10.62/63 2个数据节点 :192.168.10.64/65 2个HAProxykeepalived节点:IP:192.168.10.68/69 虚拟 VIP:192.168.10.100 优点 ✅ 业务零改动✅ 自动剔除故障 SQL 节点…

作者头像 李华
网站建设 2026/7/22 12:23:13

工业PLC通信必备的USB转232驱动安装完整指南

工业PLC调试不翻车:USB转232驱动安装实战全解析 你有没有遇到过这样的场景? 现场调试一台老型号的西门子S7-200 PLC,手头只有轻薄本,插上USB转232线后,设备管理器里却死活不显示COM口;或者好不容易识别了…

作者头像 李华
网站建设 2026/7/15 21:31:09

注意力优化与高效推理

一、冗余计算的产生(KV Cache 的诞生背景) Decoder 架构的大模型生成文本时,存在大量重复计算:以输入 “中国的首都是” 为例,模型生成过程是逐 token 自回归的: 输入 “中国的首都”,计算每个 token 的注意力,预测下一个 token “是”; 将 “是” 拼接后,用其 embe…

作者头像 李华
网站建设 2026/7/19 19:23:06

全面讲解二极管分类:按功能划分的实用解析

二极管不只是“单向导电”:从功能到实战的深度拆解你有没有遇到过这样的情况?设计电源时发现效率上不去,排查半天才发现续流二极管压降太高;做信号保护电路时,MCU IO口莫名其妙损坏,结果是TVS响应不够快&am…

作者头像 李华