vs2019中的属性页使用说明

简单来说,这是一个 "全局设置" vs "局部设置" 以及 "编译器设置" vs "链接器设置" 的问题。

把编译链接过程分成两大阶段:

  1. 编译阶段 (Compile):将 .cpp 源文件变成 .obj 目标文件。
    ○ 需要:头文件 (.h, .hpp)。
    ○ 负责方:C/C++ 编译器。
  2. 链接阶段 (Link):将所有的 .obj 文件和库文件 "粘合" 成一个可执行文件 (.exe) 或动态库 (.dll)。
    ○ 需要:库文件 (.lib)。
    ○ 负责方:链接器 (Linker)。
    理解了这两个阶段,我们再来看这些目录的作用:
    配置位置 配置项 作用于哪个阶段? 用来找什么?
    VC++ 目录 包含目录 编译阶段 头文件 (.h, .hpp)
    C/C++ 附加包含目录 编译阶段 头文件 (.h, .hpp)
    VC++ 目录 库目录 链接阶段 库文件 (.lib)
    链接器 附加库目录 链接阶段 库文件 (.lib)
    链接器 附加依赖项 链接阶段 具体的库文件名 (如 opengl32.lib)
    看到这里你可能会问:那"包含目录"和"附加包含目录"有什么区别?"库目录"和"附加库目录"又有什么区别?

"VC++ 目录" vs "C/C++/链接器 中的附加目录"

这是问题的关键,区别在于 作用域和优先级。

  1. VC++ 目录 - 全局/项目级设置
    ● 包含目录: 你在这里设置的路径,对整个项目(包括所有子项目,如果你在解决方案级别设置,则对解决方案下所有项目)都有效。它是一种全局的、共享的路径设置。
    ● 库目录: 同上,是全局的库文件查找路径。
    特点:
    ● 继承性:这些设置会被项目中的所有配置(Debug/Release)和所有平台(x86/x64)继承。
    ● Visual Studio 级别:在老版本VS中,它甚至可以被设置为系统环境变量级别的全局设置,现在更推荐在项目属性中设置。
    ● 优先级较低:当与"附加"目录冲突时,通常"附加"目录的优先级更高。
  2. C/C++ 中的"附加包含目录" & 链接器中的"附加库目录" - 配置级设置
    ● 附加包含目录: 这个设置是针对 特定的项目配置(例如,仅对当前项目的 Debug x64 配置有效)。如果你切换到 Release x86 配置,这里的设置是不同的。
    ● 附加库目录: 同上,是针对特定配置的库路径。
    特点:
    ● 灵活性高:你可以为Debug版本和Release版本设置不同的头文件或库路径。例如,Debug版本链接调试版的库,Release版本链接发布版的库。
    ● 优先级高:编译器/链接器在查找时,通常会优先在这些"附加"目录中搜索。
    ● 推荐用法:对于项目具体依赖的第三方库,更推荐放在这里,因为它更精确,不会影响到其他不相关的配置或项目。

路径到底该放在哪个位置?【最佳实践】

这是一个经验和习惯问题,但遵循以下原则会让你的项目更清晰、更易于管理:

  1. 系统级、公共的、几乎所有项目都要用的库
    ○ 例如:Windows SDK, VC Runtime 的路径。
    ○ 放置位置:通常由VS自动设置,你一般不需要修改 VC++ 目录。如果你自己安装了一些全局库,可以考虑放在这里,但不推荐。
  2. 本项目专用的第三方库 (最常见的情况!)
    为什么? 因为这样你可以为Debug和Release配置设置不同的路径。例如:
    ○ 场景:你的项目依赖于 OpenCV, Boost, SDL2 等。你希望Debug配置用opencv_world455d.lib,Release配置用opencv_world455.lib。
    ○ 放置位置:
    ■ 头文件路径:放到 C/C++ -> 附加包含目录。
    ■ 库文件路径:放到 链接器 -> 附加库目录。
    ■ 具体的库文件名:放到 链接器 -> 附加依赖项。
    ○ Debug配置的附加库目录: D:\Libraries\OpenCV-4.5.5\lib\Debug
    ○ Release配置的附加库目录: D:\Libraries\OpenCV-4.5.5\lib\Release
  3. 解决方案中多个项目共享的库
    ○ 如果你的解决方案里有多个项目(比如一个MathLib和一个依赖它的MainApp),你可以:
    ■ 方法A (推荐):使用 属性表 (.props文件)。创建一个公共的 .props 文件,在里面设置附加包含目录和附加库目录,然后让所有项目都引用这个属性表。这是最专业、最可维护的方式。
    ■ 方法B:在解决方案级别设置 VC++ 目录。但这样不够灵活,容易造成配置混乱。

总结与类比

你的选择 优点 缺点 适用场景

使用"附加..."目录 灵活、精确、安全。可以针对不同配置(Debug/Release)设置不同路径,是当前的最佳实践。 需要在每个项目的不同配置中分别设置。 绝大多数情况,特别是项目引入第三方库时。

使用"VC++目录" 方便。设置一次,所有配置和项目都生效。 不灵活、危险。容易造成不同配置间的冲突(例如Debug配置错误链接了Release的库)。 已逐渐被属性表取代。不建议在新项目中主动使用。

一个简单的比喻:

● VC++ 目录 就像系统的 PATH 环境变量,是全局的。

● 附加包含/库目录 就像你在某个应用的快捷方式里设置的"起始位置",是局部的、针对特定应用的。

最终建议

对于新手和绝大多数项目:

● 永远只使用 "C/C++ -> 附加包含目录" 和 "链接器 -> 附加库目录"。

● 完全忽略 "VC++ 目录" 里的 "包含目录" 和 "库目录"。

● 这样能避免绝大多数"配置错乱"的问题,并且能很好地管理Debug和Release版本的差异。

按照这个原则,你的路径设置思路将会非常清晰。

相关推荐
wno70419 分钟前
Spring Security权限控制
java·python·spring
杨运交1 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow1 小时前
CountDownLatch in Java
java
SL_staff2 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程2 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff2 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
滕州市燕猫虎计算机科技工作室个体工商户3 小时前
IDEA:Command line is too long
java·ide·intellij-idea
步行cgn3 小时前
Spring p 命名空间注入详解
java·前端·spring
YatHinLay3 小时前
MyBatis 流式查询实战:ResultHandler 处理海量数据
java