首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C使target_include_directories为公共的,不适用于对象库

CMake是一个跨平台的开源构建工具,用于管理软件构建过程中的编译、链接和安装等操作。在CMake中,target_include_directories函数用于指定目标(可执行文件、静态库或动态库)的头文件搜索路径。

对于普通的可执行文件或静态库,可以直接在CMakeLists.txt文件中使用target_include_directories函数来设置头文件搜索路径,例如:

代码语言:txt
复制
target_include_directories(my_target PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

上述代码将将当前目录下的include文件夹添加到my_target目标的头文件搜索路径中。

然而,对于对象库(OBJECT库),target_include_directories函数的作用范围是有限的,它只会影响到链接阶段,而不会影响到编译阶段。这意味着,如果在对象库中使用target_include_directories函数设置了头文件搜索路径,那么在其他目标中使用该对象库时,无法继承该头文件搜索路径。

为了解决这个问题,可以将target_include_directories函数的作用范围扩展到整个项目,使其成为公共的头文件搜索路径。可以通过在顶层CMakeLists.txt文件中使用include_directories函数来实现,例如:

代码语言:txt
复制
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

上述代码将将当前目录下的include文件夹添加到整个项目的头文件搜索路径中,包括对象库和其他目标。

总结起来,对于普通的可执行文件或静态库,可以直接在目标的CMakeLists.txt文件中使用target_include_directories函数来设置头文件搜索路径。对于对象库,需要在顶层CMakeLists.txt文件中使用include_directories函数来设置公共的头文件搜索路径。

关于CMake的更多信息和用法,请参考腾讯云CMake产品文档:CMake产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

cmake学习

函数使编译器意识到它们 在最后g++编译过程,会自动链接到头文件路径 target_include_directories(hello_headers PRIVATE ${PROJECT_SOURCE_DIR...生成共享 2.生成可执行文件 PUBLIC ${PROJECT_SOURCE_DIR}/include ) 问题1:target_include_directories...用户看了头文件就知道如何使用静态文件了,即如何使用函数。 因此最后只需要将main.c、head.h和文件给用户即可。...用户就可以根据头文件中接口情况,来知道文件功能 (具体怎么实现他也不知道), 从而用户就可以使用文件来完成自己工作了(即执行main.c) 头文件使用 编译静态时,使用到头文件 编译其他目标文件时链接到静态时...问题3:静态与动态区别 头文件stdio.h,其对应是printf函数声明,其文件是printf函数实现文件,该文件有C提供,它们是标准头、文件,因此不需要指明路径和名称,且该库函数动态库函数

1.9K90

CMake基础

g++ -c hello.cpp -o hello.o g++ -c main.cpp -o main.o 其中使用 -c 选项指定生成临时对象文件 main.o,之后再根据一系列对象文件进行链接,...,有头文件时特别头疼 3.make 语法非常简单,不像 shell 或 python 可以做很多判断等 4.不同编译器有不同 flag 规则, g++ 准备参数可能对 MSVC 不适用...规则, g++ 准备参数可能对 MSVC 不适用 CMake 可以自动检测当前编译器,需要添加哪些 flag。...,我们之后会讨论如何使用他人 windows中静态是以.lib 后缀文件,动态是以.dll 后缀文件 linux中静态是以.a 后缀文件,动态是以.so后缀文件 创建以后,...(-fopenmp) # 添加编译器命令行选项 注:没有target_前缀选项会让项目所有文件都添加选项属性 tips:add_definitions(NOMINMAX) 可以在C++定义变量

1.9K20

破局Cmake中PRIVATE,PUBLIC,INTERFACE

Bprivate property 如果XXXpublic,A可传递属性变成Bpublic property 如果XXXinterface,A可传递属性变成Binterface...}/includeB) add_executable(CPP main.c) target_link_libraries(CPP B) 解读一下CmakeLists.txt,红色传递过来属性...PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/includeA)//修改代码 解读一下CmakeLists.txt,红色传递过来属性,紫色是CPP额外加属性 看到C自身属性添加了...)不会编译出任何和可执行文件,而且C所有属性必须设置INTERFACE 解读一下CmakeLists.txt,红色传递过来属性 最后也可以完美的运行!...这里C就是一个header-only,他所有属性都是Interface,不会编译出任何,唯一作用就是将属性传递给link它目标。

78030

CMake打包以及支持find_package

相关配置在config.hpp.in中被定义,然后这个文件会被CMake预处理config_impl.hpp,然后被config.hpp包含到项目中去(#include "config_impl.hpp...这里有个额外知识,我们知道target_include_directories()指定了对象include目录,当这个target T 被其他target通过target_link_libraries...CMake有一个特性可以支持修复上述问题,就是生成器表达式,这个特性可以允许设定目标对象在构建和安装时,使用不同include目录,我们需要将target_include_directories()...中配置相应版本(通过替换@中版本变量相应正确版本号)和完成安装。...还需要定义一个my_library-config-version.cmake.in配置文件,和上述一样,用于版本兼容性检查和控制。

31600

解决CMAKE_CURRENT_SOURCE_DIR

灵活性:CMake提供了丰富功能和选项,使开发者能够灵活地配置项目的构建过程。你可以指定编译选项、链接、生成多个目标等。模块化:CMake支持模块化方式来组织和管理项目。...CMake工作原理CMake工作原理可以简单概括以下几个步骤:创建CMakeLists.txt文件:在项目根目录下创建CMakeLists.txt文件,或者在每个子目录下都创建一个CMakeLists.txt...add_executable:用于添加一个可执行文件目标。add_library:用于添加一个文件目标。...add_subdirectory:用于添加子目录,指定子目录中CMakeLists.txt文件。target_include_directories用于设置包含目录。...target_link_libraries:用于设置链接。set:用于设置变量。if、elseif、else、endif:用于条件判断。

32830

CC++生态工具链——单元测试工具Catch2简介

由于BDD使用非常简单语言来描述测试过程,更方便沟通和迭代,使产品经理、开发者和测试者都可以深入了解项目的进展,使开发出来产品可以快速响应用户反馈和需求。...四,Catch2介绍 Catch2是主要用于C++开发场景单元测试框架,用法和googletest有几分相似,但是定义测试用例名称时候不需要像googletest那样严格,googletest要求必须是有效...C++变量名且不包含C++关键字。...测试用例之间相互隔离,同一个测试用例内部,又可以分割多个section,每个section都是独立运行单元。 测试用例命名时支持自由格式字符串命名。...方式2,头文件模式 利用target_include_directories函数将Catch2头文件所在路径告诉给编译器。

1.5K20

云课五分钟-03第一个开源游戏复现-贪吃蛇

项目名为DungeonRush,版本号为0.1.0,项目描述“一个受snake启发游戏”,编程语言C。...find_package 函数调用 这些行用于查找和加载所需SDL2和相关(如SDL2_image、SDL2_net、SDL2_mixer和SDL2_ttf)。...target_include_directories 函数调用 这些行用于向目标添加头文件目录,以便编译器能够找到必要头文件。...target_link_libraries 函数调用 这行代码用于将目标链接到所需。这里链接了SDL2多个(如SDL2::Main, SDL2::Net等)以及m(通常是数学)。...这个CMakeLists.txt文件整体上用于配置一个使用SDL2和相关游戏项目的构建。它设置了项目的基本信息、源代码文件组织、头文件和路径,以及最终输出目录。

29630

学习了CC++,居然不了解Cmake这一利器

CMAKE_C_FLAGS: C代码添加了-pipe标志,并将C标准设置C99。 CMAKE_CXX_FLAGS: C++代码添加了-pipe标志,并将C++标准设置C++11。...-D 选项用于定义变量,这里定义了 CMAKE_BUILD_TYPE 变量,其值被设置 Debug,生成调试版本构建文件,通常包括额外调试信息,以便于我们去调试程序。...target_include_directories 允许指定特定目标(可执行文件或头文件搜索路径,这提供了更高灵活性和更清晰代码组织。...add_library:用于定义一个目标,这里定义了一个名为 math ,STATIC 表示静态,动态可使用 SHARED。...target_link_libraries 用于目标(可执行文件或)添加链接。maindemo 是要链接目标名称,即第一行定义可执行文件。

12010

万字总结编译利器CMake,从入门到项目实战演练

是我们自己实现用于计算数字平方根。可执行文件可以使用此,而不是使用编译器提供标准平方根函数。 在本教程中,我们将放入名为MathFunctions子目录中。...下一个更改是使构建和链接MathFunctions成为布尔选项。...ctest将构建和测试项目,并将结果提交给Kitware公共仪表板Dashboard。Dashboard结果将被上传到Kitware公共Dashboard。...Demo依赖 [100%] 构建 C 对象 CMakeFiles/Demo.dir/main.cc.o 链接 C 可执行文件演示 [100%] 构建目标演示 [ehome@xman Demo1]$ ....例如,可以将 MathFunctions 设为一个可选,如果该选项 ON ,就使用该定义数学函数来进行运算。否则就调用标准数学函数

1.1K00

ATL CLR MFC Win32 常规 区别

---- 文章1 ATL用于编写COM程序,CLR是.NET公共语言运行库,MFC是指MFC类,MFC程序是用这些类做出程序,WIN32常规就是不用 MFC,使用API函数编程序。...CLR是随着.Net Framework 2 和VS2005一起发布,其核心实现和C#,VB.net 一样。都是基于公共语言运行库。....所以C++/CLI目前还是微软一家之言。 ATL用于编写COM程序。ATL貌似也年纪很大了,至少在我接触到VC时候就有它存在了。...MFC是微软基本类用于使用Visual C++开发环境创建本地应用程序。顾名思义,CLR具有跨平台、跨语言特性,各种语言都可以使用CLR开发.NET平台上应用程序。...工程创建和设置如下: 1)首先创建一个MFC工程。例如,支持MFCWin32控制台应用程序。 2)配置项目,使工程具有公共语言运行库支持。

1.4K30

CMake简易指南

感谢 C++委员会大力推广,几乎支持市面上所有通用编译环境,以及大部分开源三方均支持 cmake核心概念Target:目标单元,在CMake中,target是一个非常核心概念,与其他现代化工程系统中...之后支持,可以理解它将target定义成了一个对象对象中包含了若干成员(编译参数)// 以下为解释target罗列伪代码struct Target { std::list include_directories...合理利用属性继承能让依赖变得清晰以target_include_directories例,详细说明参考官方文档target_include_directories( [SYSTEM]...INTERFACE:用于INTERFACE类型目标(如:导入库,空),依赖目标生效,继承方式等同PUBLIC。...交叉编译除了可是使用工具链,也可以在配置阶段通过参数指定编译器等信息实现交叉编译;工具链除了可以用于交叉编译,也可用于编译系统扩展,如:vcpkg 中可用于查找内置三方工具链文件扩展工具链微软开源项目中工具链文件

71950

如何提升云计算数据保护状态

数据保护中云计算利用状况 许多供应商只使用云计算来存储备份数据集精确副本,这有效地使公共云成为磁带替代品,但不会缩小本地存储基础设施。...它具有内置扩展和持久性功能,使其成为长期数据保留理想选择。然而,对象存储通常不适合作为生产应用程序存储。...用于高级云数据保护Actifio 10c Actifio公司采用模型不同于传统数据保护解决方案。首先,它以本机应用程序格式存储数据,使得几乎所有进程或服务都可以即时访问。...在Actifio 10c中,客户还可以同时将数据复制到多个公共云中,以最终实现灾难准备,或者不同用例创建云平台。同样,由于它是本机格式,因此这些服务可以直接访问它。...Actifio 10c还解决了将数据从云计算对象存储移动到基于云块存储基础设施问题。它通过在对象存储和基于块存储之间启动SSD硬盘缓存来实现。

92510

深入了解Java对象序列化

本文以序列化和其相关概念,并试图描绘它一些角落和缝隙,及其实现Java API。 概述 序列化使任何POJO可持久化转换成字节流。字节流,然后可以存储在一个文件,内存或数据。 ?...在序列化,这意思是源自一个预定义数据结构类和实例化都叫到一个活跃实称为Java对象。原始比特流然后存储在一个存储,如一个文件在文件系统中,数组在内存字节数,或者存储在数据中。...这个接口不包含成员和用于指定一个类可序列化。如前所述,所有继承子类也默认序列化。指定类成员变量都坚持除了成员声明为瞬态和静态;他们不坚持。在下面的例子中,A类实现了Serializable。...观察到任何变化静态和瞬态变量不存储在这个过程。有许多问题与序列化过程。正如我们所看到,如果一个超类声明可序列化,所有的子也会序列化类。这意味着,如果一个继承B继承了C继承D…将序列化对象!...原因是JVM修改内部类构造函数通过添加一个引用父类编译。因此,有一个无参数构造函数概念是不适非静态内部类。

92280

使用 ChatGPT 提高代码质量并减少技术债

不适亲密/违反封装:该方法直接操作wordDictionary._gloomScore似乎是私有字段。该方法应该尊重对象封装,并且不应该直接访问其字段。相反,使用方法来操纵它们。...: 使 WordDictionary. _ looomScore 成为带有私有 setter 公共属性: 这使得从类外部读取 GloomScore 变得更加容易,同时仍然可以防止外部代码直接更改它。...ChatGPT 可以分析您代码,识别偏离最佳实践区域,并提出改进建议。本节探讨 ChatGPT 如何帮助您在 C# 代码中实现 SOLID 面向对象设计原则,包括接口隔离原则 (ISP)。...如果您发现某些方法不适用于类,您可以重新考虑您类和接口设计(请参阅上面有关 ISP 观点),而不是抛出异常。...您可以通过突出显示您代码,直接要求这些扩展生成优化且高效代码建议。 文档帮助——这些由 AI 驱动扩展可以帮助 C# 方法、属性和类编写 XML 注释,从而确保代码有良好文档记录。

19910
领券