Visual Studio 2022创建动态库和静态库

本文介绍了Windows环境下使用Visual Studio 2022如何创建和使用静态库和动态库。


一些概念

常用宏

含义 示例
$(SolutionDir) 当前解决方案(.sln 文件)所在的目录路径 $(SolutionDir)external\include
$(ProjectDir) 当前项目文件(.vcxproj)所在目录 $(ProjectDir)libs\
$(Configuration) 当前配置名称(Debug/Release) $(SolutionDir)output\$(Configuration)\
$(Platform) 当前平台名称(Win32/x64) lib\$(Platform)\

在 VS 属性页中,这些宏会被自动展开显示实际路径,可以在项目属性的任意路径框中点击下拉箭头 -> 编辑 -> 点击”宏>>“按钮查看所有可用宏

$(SolutionDir) 是 VS 的预定义宏,表示:

  • 当前解决方案(.sln 文件)所在的目录路径;

  • 自动包含结尾的反斜杠\

例如:如果解决方案在 C:\Projects\MyApp\,则 $(SolutionDir) 展开就是 C:\Projects\MyApp\

完整路径 $(SolutionDir)external\include 表示:

在解决方案目录下寻找 external 子文件夹,然后在其中寻找 include 子文件夹,示例展开结果:C:\Projects\MyApp\external\include\

项目属性选项

C/C++ > 常规 > 附加包含目录

  • 作用:指定编译器在编译阶段查找头文件(.h/.hpp)的额外目录路径
  • 使用场景:当你的项目使用第三方库的头文件时,如果这些头文件不在项目目录或默认包含路径中
  • 示例:D:\libraries\boost\include;$(SolutionDir)external\include

链接器 > 常规 > 附加库目录

  • 作用:指定编译器在链接阶段查找库文件(.lib)的额外目录路径
  • 使用场景:当你的项目依赖第三方库时,如果这些库不在默认搜索路径中,就需要在这里添加它们的存放路径
  • 示例:D:\libraries\boost\lib

链接器 > 输入 > 附加依赖项

  • 作用:明确指定项目链接时需要使用的库文件名(.lib)
  • 使用场景:列出所有需要链接的库文件,包括第三方库和系统库
  • 示例:opengl32.lib;glfw3.lib;assimp.lib

它们之间的关系

  • 编译阶段:附加包含目录帮助编译器找到头文件
  • 链接阶段:附加库目录帮助链接器找到库文件位置,附加依赖项告诉链接器具体要链接哪些库

最佳实践建议

  1. 使用相对路径(如$(SolutionDir))而非绝对路径,方便项目迁移
  2. 对于大型项目,考虑使用属性表(.props)来统一管理这些设置
  3. 调试时如果出现”未找到头文件”错误,检查附加包含目录;出现”无法解析的外部符号”错误,检查附加库目录和附加依赖项

为什么这样写是好习惯

  1. 跨机器兼容性:无论项目被复制到什么位置都能正确找到路径
  2. 团队协作友好:不同开发者可以有不同的本地路径,但都能正确编译
  3. 清晰的项目结构:明确将第三方库放在 external 目录是常见做法

静态库