Visual Station 2022的头文件包含目录设置的区别

2023-11-13

1 前言:

对vs的包含头文件的组织,你困惑吗?

  • 困惑
  • 有点困惑
  • BullS----
    在没喊出**BullSHI----**之前,我先查了很多博客,结果,有的说:
  1. VC++ Directories -> Include Directories 适用于当前项目。
  2. C/C++ -> General -> Additional Include Directories。 适用于所有项目,修改了系统include变量。

为啥呢?一般为不知道?
有的说:

VC++目录:
代表的是全局项目的包含目录

我困惑的抖起来,这已经矛盾了啊。。。
再看,有的说:

VC++目录:
包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录
C/C++:
常规->附加包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录(每一项对应一个文件夹XXXX,文件夹中包含了编译时所需的头文件,使用时直接#include即可)

我几乎现在要喊:BullSHI----


结论:

老规矩,先写结论方便看完就闪人:

  • 本地项目,自己的项目用的库文件:用C/C++选项来设定
  • 系统环境变量里面已经定义的库,已经安装的库,已经被其他项目用的库,例如,一些开源库,用VC++的定义来设定
  • 如果你在VC++下设定头文件,那么库的链接也最好放在这里
  • 如果在C/C++设定了某个库的头文件,那么这个库的链接也放在这

2 VS头文件的包含路径的两种设置和概念的混淆:

  • 设置方法1:项目/属性页/配置属性/VC++ 目录/包含目录
    VC++ 目录

【官方解释:使用此VC++ 目录属性页可告知Visual Studio生成当前【案,这个当前是针对Vs的解决方案来说的】所选项目时要使用的目录。VC++ 目录属性适用于项目,而不是顶级解决方案节点。 如果在“配置属性”下未看到“VC++ 目录”,请在“解决方案资源管理器”窗口中选择一个 C++ 项目节点:
“VC++ Directories -> Include Directories” : Directory settings displayed in the window are the directories that Visual Studio will search for include files referred to in your source code files. Corresponds to environment variable INCLUDE. More information】
具体可以参考链接VC++ 目录”属性页 (Windows)
在这里插入图片描述

  • 设置方法2:项目/属性页/配置属性/C/C++
    VC++ 目录
    在这里插入图片描述
    【官方解释,“C/C++ -> General -> Additional Include Directories”: The directory to be added to the list of directories searched for include files.感觉这个英式中文写的晦涩难懂】
    具体可以参考链接[C/C++]
    主要的内容,贴在下面:

备注
若要添加多个目录,请使用此选项多次。 仅在找到指定的包含文件之前搜索目录。
【这里意思,是】
可以在与 (/X (忽略标准包含路径) ) 选项相同的命令行上使用此选项。
#include例如, #include “local.h” 可以在双引号 (或本地优先) 形式中指定指令
或者,可以在尖括号中指定 (或包含路径优先) 形式,例如 #include 。

编译器会按以下顺序搜索目录: 如果指令是使用双引号格式指定的 #include ,则它首先搜索本地目录。 搜索在包含 #include指令的文件所在的目录中开始。 如果找不到该文件,它将在当前打开的包含文件的目录中的下一项搜索,其顺序与它们的打开顺序相反。搜索从父包含文件的目录中开始进行,然后继续向上到任何祖父包含文件的目录。
#include如果指令是以尖括号形式指定的或者如果本地目录搜索失败,则它会按照命令行中指定的顺序搜索使用 /I 选项指定的目录。 在环境变量中 INCLUDE 指定的目录。【案,这一段更像是说明头文件的搜索的顺序】

  • 这么多设定项目,都是设定头文件包裹路径的,这个应该都会困惑吧?

3 VS头文件的包含路径的两种设置的不同

  • 这两个包含路径本质上没有区别都是编译要用到的头文件和库,都可以用,只不过编译顺序对这两个设定有了约束【参考下一节】

  • 区别仅仅是VC++ 目录,更像是环境变量中的Path,也就是它推荐应用的是其他工程中的头文件或者库

  • 而C/C++,这更倾向于本项目用到的头文件和库,例如你要生成库,链接库还有生成可执行文件等等


4 再从编译顺序理解头文件设定不同:

头文件的优先顺序,主要的影响就是编译的时候,会遇到重复定义的情况,还有就是头文件之间的依赖关系也有先后。
MSVS的头文件的查找优先级别分3个级别,首先是从1开始,再到2,再到3,也就是1的优先级顺序比3高。

The compiler searches for directories in the following order:
1.Directories containing the source file.
源文件代码所在的文件夹中寻找头文件(即包含文件);

2.Directories specified with the /I option, in the order that CL encounters them.
在使用MSVC编译的时候,通过参数 /I 来指定的搜索目录;(相当于是“附加包含目录”设置的)
其中 /I 是由 C/C++ -> 常规-> 附加包含目录 来设置的。

3.Directories specified in the INCLUDE environment variable. 通过 LIB 环境变量指定的搜索目录;(相当于是“库目录”设置的) LIB 环境变量 是由 VC++目录 -> 包含目录 来设置的

【案,由此,我们可以看到,头文件编译加载的优先级C/C++要高于VC++目录,显然,本项目的头文件紧密相关应该置于C/C++的包含设定下比较合适,那么何时用VC++,当我们涉及到引用系统环境变量的头文件定义的时候,这一点,在很多开源软件例如PCL中,一般会强调自己要放在系统的环境变量里面,这样一次下载安装的PCL库,可以被你本地各个不同的项目来方便应用,VC++的这个设定显然是指的这种库,说到这里应该比较清楚了,希望对大家的理解有帮助】


5 再从链接的设定侧面验证一下:

In C++, you got the header files (.h), the (.lib) files and the (.dll) files.
In Visual Studio, you provide the location to search for these files in three different places:
Configuration Properties => C/C++ => General => Additional Include directories. Here you list out the “include” directories that you want searched and made available.
附加包含目录—添加工程的头文件目录:项目->属性->配置属性->C/C+±>常规->附加包含目录:加上头文件的存放目录;
Configuration Properties => Linker => General => Additional Library directories. Here you list out the “lib” directories that you want to be searched and made available.
附加库目录—添加文件引用的lib静态库路径:项目->属性->配置属性->链接器->常规->附加库目录:加上lib文件的存放目录;
Configuration Properties => Linker => Input => Additional dependencies. Here you explicitly specify the .lib files that want to include.
附加依赖项—添加工程引用的lib文件名:项目->属性->配置属性->链接器->输入->附加依赖项:加上lib文件名。

显然,链接库的设定取之于C/C++的设定项。

其他问题

包含目录和附加包含目录区别:

包含目录:修改了系统的include宏的值,是全局的;
附加包含目录:用于当前项目,对其他项目没有影响。

参考:

Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别

VS中C++的包含目录、附加包含目录和库目录和附加库目录的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Station 2022的头文件包含目录设置的区别 的相关文章

  • C/C++语言实现WiFi(socket)数据收发(客户端和服务端)

    目录 客户端 client 服务端 server C C 实现TCP通信 接收WIFI数据 编程环境 VC 6 0 手机端 使用WiFi调试助手 提示 整个过程在局域网中进行 很多编程语言都可以实现socket通信 本博客将通过C C 实现
  • C++知识积累:内存对齐理解

    为什么要进行内存对齐 这是因为CPU的读取总是对齐的 举个例子 假设CPU是32位的 那么CPU每次读取的4字节数据的首地址都是4的倍数 也就是说 内存中数据首地址为4的倍数时 CPU一次操作就可以完成数据读取 假设有一个int型四字节大小
  • IUnknown—COM和MFC

    转自 http hi baidu com zhangqiuxi blog item 6d9603ad9c8fe5084b36d6a0 html 问题 我用MFC编写COM程序有一段时间了 知道如何使用宏和嵌套类 以及如何在嵌套类中处理IUn
  • 编写递归算法,计算二叉树叶子结点的数目。

    编写递归算法 计算二叉树叶子结点的数目 编写递归算法 计算二叉树叶子结点的数目 include stdio h 包含 getchar scanf printf include malloc h malloc 动态申请空间 函数 二叉树 结点
  • Vc/MFC中自定义消息及其PostMessage触发使用

    http blog csdn net ztz0223 article details 2058402 http blog csdn net a8082649 article details 7733527 http bbs csdn net
  • c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建

    推荐视频课程 https www bilibili com video BV1et411b73Z p 2 已投币三连 b站果然是个学习的网站 本来是想在linux环境下运行QT 于是先学了几个月linux嵌入式驱动开发 后来发现太底层了 与
  • JNA模拟复杂的C类型——Java映射char*、int*、float*、double*

    文章目录 引言 Java Native Type Conversions Java和C基本类型指针对应关系 Pointer的具体用法 引言 最近项目在用Java调用C写的一些三方库 没办法直接调 用Java封装一下C的接口 这就少不了要用到
  • c++得到窗口句柄

    include
  • vector,list,deque区别

    http blog csdn net renkaihao article details 6803866 vector和built in数组类似 它拥有一段连续的内存空间 并且起始地址不变 因此它能非常好的支持随即存取 即 操作符 但由于它
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • C++学习笔记12:输入输出流实例整理(文本文件读写,二进制文件读写,一组数据的文件读写,随机访问文件实例

    这也太难记了555老阔疼 文件读写示例 include
  • 检查内存泄露

    自己编写的视频处理程序出现了一个问题 每帧的运行时间随着运行时间在不断增长 很大可能是出现了内存泄露 于是学习了一些查看内存泄露的方法 做了两种尝试 一是VS自带的DEBUG下的检测 view pl html view plain copy
  • 【数据结构/C++】树和二叉树_二叉链表

    include
  • C++中的并发多线程网络通讯

    C 中的并发多线程网络通讯 一 引言 C 作为一种高效且功能强大的编程语言 为开发者提供了多种工具来处理多线程和网络通信 多线程编程允许多个任务同时执行 而网络通信则是现代应用程序的基石 本文将深入探讨如何使用C 实现并发多线程网络通信 并
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C 语言运算符详解

    C 语言中的运算符 运算符用于对变量和值进行操作 在下面的示例中 我们使用 运算符将两个值相加 int myNum 100 50 虽然 运算符通常用于将两个值相加 就像上面的示例一样 它还可以用于将变量和值相加 或者将变量和另一个变量相加
  • C 语言运算符详解

    C 语言中的运算符 运算符用于对变量和值进行操作 在下面的示例中 我们使用 运算符将两个值相加 int myNum 100 50 虽然 运算符通常用于将两个值相加 就像上面的示例一样 它还可以用于将变量和值相加 或者将变量和另一个变量相加
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC

随机推荐

  • SVN 检查修改或者提交代码时候一直显示"please wait"的解决办法(汉化版本显示"请稍候")

    在提交使用vue写的前端代码时候一直显示 请稍候 检查修改时候也是这样显示 原因是 下载代码后 npm install 安装了依赖 可以在SVN中取消对相关依赖的控制 操作方法
  • iscsi使用教程(中)

    服务端管理命令 tgtadm 是一个模式化的命令 其使用格式如下 tgtadm lld driver op operation mode mode OPTION 其中模式 mode 和操作 operation 对应关系如下 模式 操作 ta
  • JAVA经典面试题

    九种基本类型及封装类 基本类型 boolean byte char short int long double void 二进制位数 1 8 一字节 16 2字节 16 2字节 32 4字节 64 8字节 64 8字节 封装器类 Boole
  • sqli-labs通关(less1~less10)

    目录 题外话 Less 1 Less 2 Less 3 Less 4 Less 5 Less 6 Less 7 Less 8 Less 9 Less 10 这10关都是GET型的 包括了union注入 报错注入 布尔盲注和时间盲注 虽然包含
  • 一文读懂MySQL事务:提升你的数据库操作技能

    概述 事务可以保证多个操作原子性 要么全成功 要么全失败 对于数据库来说事务保证批量的DML要么全成功 要么全失败 事务具有四个特征ACID 原子性 Atomicity 整个事务中的所有操作 必须作为一个单元全部完成 或全部取消 一致性 C
  • pytdx接口API说明

    标准行情接口API pytdx hq 下面是如何在程序里面调用本接口 首先需要引入 from pytdx hq import TdxHq API 然后 创建对象 api TdxHq API 之后 通常是如下的格式 if api connec
  • python可以在多种平台运行 这体现了python语言的_Python快速编程入门课后习题答案...

    目录 前言 第一章 一 填空题 二 判断题 三 选择题 第二章 一 填空题 二 判断题 三 选择题 第三章 一 填空题 二 判断题 三 选择题 第四章 一 单选题 二 判断题 三 填空题 第五章 一 选择题 二 判断题 三 填空题 第六章
  • 3_服务容错_保护断路器_@EnableCircuitBreaker和引入@SpringCloudApplication

    前言 前面做了一个简单的服务 注册 服务发现 服务提供者和消费者的项目 现在我们还是准备之前的项目代码 1 服务容错保护 准备的项目工程 1 服务注册中心 端口为1111 2 服务提供者 端口为8080 8081 3 服务消费者 端口为90
  • 华为OD机试真题- 天然蓄水库【2023】【JAVA、Python、C++】

    题目描述 描述 公元2919年 人类终于发现了一颗宜居星球 X星 现想在X星一片连绵起伏的山脉间建一个天热蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正整数数组s表示 每个元素代表山脉的高度 选取山脉上两个点作为蓄水库的边界 则边界
  • Springboot连接FISCO-BCOS链

    依赖 FISCO BOCS 2 5 0 JAVA 1 8 Spring Boot 2 0 2 官方文档 前期准备 部署FISCO BOCS 2 5 0 引入SDK
  • ue 清理缓存_mpvue应用之组件数据缓存清理

    题图 被mpvue周期搞疯的你 之前介绍过美团外卖C端 H5 小程序页面大量基于mpvue框架的能力 使用Vue组件打通了原生小程序页面和H5页面的隔阂 再结合小程序自带的原生组件功能 就构成了整个外卖跨端应用的终端部分架构 但是随着页面规
  • 唐诗三百首出现最多的字是什么?大数据分析告诉你

    一个人要是长时间一直做一件事 思维容易固化 就像那些从太空回来的宇航员 吃饭时容易丢开拿在手里的勺子 当勺子掉在地上时 哦 我已经回到地球了 所以 适当尝试新鲜事物 既是对大脑的放松 也是开阔思路的好机会 好方法 那这次 博主尝试的新事物是
  • 腾讯面经 集合

    腾讯机器学习复试 gbtd和xgboost区别和优缺点 XGBoost是GBDT一个工程化的实现 第一 GBDT将目标函数泰勒展开到一阶 而xgboost将目标函数泰勒展开到了二阶 使用泰勒展开到二阶的原因 统一损失函数求导的形式以支持自定
  • CFLAGS详解

    Makefile选项CFLAGS LDFLAGS LIBS CFLAGS 表示用于 C 编译器的选项 CXXFLAGS 表示用于 C 编译器的选项 这两个变量实际上涵盖了编译和汇编两个步骤 CFLAGS 指定头文件 h文件 的路径 如 CF
  • XXXXXXXXXXXXX

    Netflix主机性能监视工具Vector http www chinaz com web 2015 0414 398451 shtml 云雀科技是总部位于西雅图的新兴的云服务公司 利用业界 最新技术打造下一代具有高密度动态计算能力的云平台
  • 初学网络安全不可不知的:10款开源安全工具

    随着互联网的不断发展 安全问题也越来越受到企业的重视 但安全问题往往需要大量资金的投入 例如聘请安全工程师 产品研发 测试等流程 这对于那些原本就资金紧缺的企业而言 是绝对无法接受的 因此 为了减少在这方面的资金投入 许多安全人员都会选择使
  • keyframes介绍与调用动画方法

    keyframes介绍 keyframes changecolor 0 background red 50 background red 100 background green 在一个 keyframes 中的样式规则可以由多个百分比构成
  • APB总线详解及手撕代码

    本文的参考资料为官方文档AMBA 3 APB Protocol specification 文档下载地址 https pan baidu com s 1Vsj4RdyCLan6jE quAsEuw pwd w5bi 提取码 w5bi APB
  • Spring Bean如何保证并发安全

    1 可以设置Bean的作用域为原型 这样每次从容器中获取到的Bean就是一个新的实例 避免了多线程共享同一个对象实例的问题 2 不改变Bean作用域的情况下 可以避免在Bean中存可变状态的声明 尽量使用局部变量或使用线程安全的数据结构 3
  • Visual Station 2022的头文件包含目录设置的区别

    1 前言 对vs的包含头文件的组织 你困惑吗 困惑 有点困惑 BullS 在没喊出 BullSHI 之前 我先查了很多博客 结果 有的说 VC Directories gt Include Directories 适用于当前项目 C C g