news 2026/5/27 14:51:13

include_directories和target_include_directories说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
include_directories和target_include_directories说明

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

文章目录

      • 1. `include_directories`:全局头文件路径指定
        • 作用
        • 语法
        • 示例
        • 缺点
      • 2. `target_include_directories`:目标级头文件路径指定
        • 作用
        • 语法
        • 示例
        • 作用域场景说明
      • 3. 对比与推荐

在CMake中,include_directoriestarget_include_directories都是用于指定头文件搜索路径的命令,但其作用范围和使用场景有显著区别。以下是详细介绍:

1.include_directories:全局头文件路径指定

作用

后续所有目标(target)添加头文件搜索路径(即编译器的-I选项)。添加的路径会对之后通过add_executableadd_library创建的所有目标生效,是全局生效的命令。

语法
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
  • AFTER|BEFORE:指定路径添加的顺序(在已有的搜索路径之后/之前),默认是AFTER
  • SYSTEM:将路径标记为“系统头文件目录”,编译器可能会对这些目录下的头文件减少警告(例如GCC的-isystem选项)。
  • dir1, dir2...:需要添加的头文件路径(绝对路径或相对路径,相对路径基于当前CMakeLists.txt所在目录)。
示例
cmake_minimum_required(VERSION 3.10) project(MyProject) # 向后续所有目标添加"include"目录作为头文件搜索路径 include_directories(include) # 目标myapp会自动包含"include"路径 add_executable(myapp src/main.cpp) # 目标mylib也会自动包含"include"路径 add_library(mylib src/lib.cpp)
缺点
  • 全局生效:路径会被应用到所有后续目标,即使某些目标不需要该路径,可能导致不必要的依赖或冲突(例如不同目标依赖同名头文件时)。
  • 不支持依赖传递:无法区分“当前目标需要”和“依赖该目标的其他目标需要”的路径,不适合大型项目的依赖管理。

2.target_include_directories:目标级头文件路径指定

作用

特定目标(target)单独添加头文件搜索路径,且支持通过作用域控制路径是否传递给依赖该目标的其他目标。是现代CMake推荐的用法(目标导向思想)。

语法
target_include_directories(target [SYSTEM] [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [路径1...] [<INTERFACE|PUBLIC|PRIVATE> [路径2...] ...] )
  • target:指定要添加路径的目标(必须是已通过add_executableadd_library创建的目标)。
  • SYSTEM|BEFORE:同include_directories,分别用于标记系统目录和控制顺序。
  • 核心:作用域(INTERFACE|PUBLIC|PRIVATE
    • PRIVATE:路径仅用于当前目标的编译(如目标的.cpp文件),不传递给依赖它的其他目标。
    • PUBLIC:路径既用于当前目标的编译,也传递给依赖它的其他目标(依赖目标会自动获得该路径)。
    • INTERFACE:路径不用于当前目标,但会传递给依赖它的其他目标(例如当前目标是接口库,仅提供头文件给其他目标)。
示例

假设项目结构:

project/ ├── include/ # 公共头文件(如lib.h) │ └── lib.h ├── src/ │ ├── main.cpp # 依赖mylib │ └── lib.cpp # mylib的实现(依赖include/lib.h) └── CMakeLists.txt

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10) project(MyProject) # 创建库目标mylib add_library(mylib src/lib.cpp) # 为mylib添加头文件路径: # - PUBLIC:mylib自己需要(编译src/lib.cpp时找include/lib.h), # 且依赖mylib的目标(如myapp)也需要(编译main.cpp时找include/lib.h) target_include_directories(mylib PUBLIC include) # 创建可执行目标myapp,依赖mylib add_executable(myapp src/main.cpp) target_link_libraries(myapp mylib) # myapp会自动继承mylib的PUBLIC路径(即include)

此时,myapp无需手动添加include路径,因mylibPUBLIC作用域已自动传递。

作用域场景说明
  • main.cpp文件不依赖include路径,仅.cpp文件需要,则用PRIVATE
    target_include_directories(mylib PRIVATE include) # myapp不会继承
  • mylib是接口库(无.cpp,仅提供头文件给其他目标),则用INTERFACE
    add_library(mylib INTERFACE) # 接口库 target_include_directories(mylib INTERFACE include) # myapp依赖时会继承

3. 对比与推荐

特性include_directoriestarget_include_directories
作用范围全局(后续所有目标)特定目标(仅指定target)
依赖传递不支持支持(通过INTERFACE/PUBLIC/PRIVATE)
适用场景小型简单项目中大型项目(推荐)
灵活性低(无法精确控制)高(目标级+作用域控制)

推荐使用target_include_directories,因其更符合CMake的“目标导向”设计理念,能精确控制头文件路径的作用范围和依赖传递,减少冲突,适合项目扩展。include_directories因全局生效的特性,仅建议在简单项目中临时使用。

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

如何禁止软件联网?这款免费工具一键搞定,流氓软件彻底断网

前言 在使用电脑的过程中&#xff0c;你是否遇到过这样的困扰&#xff1a;某些软件总是偷偷在后台联网&#xff0c;不仅占用带宽&#xff0c;还可能泄露隐私数据&#xff1f; 或者是一些流氓软件、病毒程序&#xff0c;一旦联网就会下载更多恶意程序&#xff0c;让电脑越来越…

作者头像 李华
网站建设 2026/5/26 17:13:21

Bypass 分流抢票

Bypass分流抢票是由Cheney.小风开发的一款基于微软.Net技术的火车票抢票软件&#xff0c;旨在帮助用户更高效地在12306平台上购票。该软件自2013年开始开发&#xff0c;经过多年的迭代&#xff0c;已经成为一个成熟且用户友好的工具&#xff0c;尤其适合在春运等高峰期使用&…

作者头像 李华
网站建设 2026/5/23 5:33:31

Qwen3-ForcedAligner-0.6B一文详解:双模型协同架构与bfloat16优化原理

Qwen3-ForcedAligner-0.6B一文详解&#xff1a;双模型协同架构与bfloat16优化原理 1. 项目概述 Qwen3-ForcedAligner-0.6B是基于阿里巴巴Qwen3-ASR-1.7B和ForcedAligner-0.6B双模型架构开发的本地智能语音转录工具。这套系统能够实现高精度的语音识别和字级别时间戳对齐&…

作者头像 李华
网站建设 2026/5/23 8:21:17

ChatGLM3-6B惊艳案例:半导体工艺文档理解+良率提升建议生成

ChatGLM3-6B惊艳案例&#xff1a;半导体工艺文档理解良率提升建议生成 1. 为什么是ChatGLM3-6B&#xff1f;——专为工业文档理解而生的轻量大模型 在半导体制造一线&#xff0c;工程师每天面对的是动辄上百页的工艺规范文档、设备操作手册、FAB厂SOP文件、失效分析报告&…

作者头像 李华
网站建设 2026/5/22 17:07:17

从入门到精通:Qwen3-ForcedAligner在ASR质检中的实战应用

从入门到精通&#xff1a;Qwen3-ForcedAligner在ASR质检中的实战应用 1. 引言&#xff1a;为什么ASR质检需要“时间标尺”&#xff1f; 你有没有遇到过这样的情况&#xff1a;语音识别系统&#xff08;ASR&#xff09;输出的文字完全正确&#xff0c;但客户却投诉“字幕跟不上…

作者头像 李华
网站建设 2026/5/21 12:57:54

RMBG-1.4 支持多场景落地:AI 净界在设计团队中的协作模式

RMBG-1.4 支持多场景落地&#xff1a;AI 净界在设计团队中的协作模式 1. 什么是 AI 净界——专为设计师打磨的“发丝级”抠图工具 你有没有遇到过这样的时刻&#xff1a; 刚收到运营同事发来的50张新品人像图&#xff0c;要求今天下班前交出带透明背景的电商主图&#xff1b;…

作者头像 李华