共享需要外部库的 Visual Studio 项目

Sharing a Visual Studio Project that requires External Libraries

本文关键字:Visual Studio 项目 外部 共享      更新时间:2023-10-16

我不是一个专业地做C++或专业地使用Visual Studio编程的开发人员。希望这个问题不是太微不足道。

包含外部库的标准方法是在项目设置中链接它们。但是,假设我想与一些同事或朋友分享这个项目。显然,他们也需要这些必需的库。

在 CMake 中,有一些模块用于检测和加载系统上以独立于路径的方式提供的库。换句话说,通过 cmake 找到库,它将自动为配置的解决方案中的标头和其他所需内容放置正确的路径。

CMake 中的某些内容变得更加复杂并减慢了开发速度 - 例如,包含和管理资源文件。因此,我想放弃CMake,转而使用标准的MSBuild Visual Studio。我唯一的挂断是我如何以这样一种方式创建我的解决方案文件,下一个编译我的代码的人不需要库与我完全相同的位置?他们是否必须在加载解决方案时自行配置解决方案?这里的标准做法是什么。

谢谢!

因此,我想放弃CMake,转而使用标准的MSBuild Visual Studio。我唯一的挂断是我如何以这样一种方式创建我的解决方案文件,下一个编译我的代码的人不需要库与我完全相同的位置?他们是否必须在加载解决方案时自行配置解决方案?这里的标准做法是什么。

取决于。当可以从 NuGet 获取外部库时,这很容易。只需让 VS 在第一次构建时还原任何依赖项即可。文件将登陆解决方案\包。

如果有 DLL 的源代码要添加到特定于项目的解决方案中,则可以将它们包含在解决方案\Subdir 中,其目标 DLL 和 LIB 将最终出现在解决方案\调试或 \x64\调试中。

如果解决方案中存在没有源的外部 DLL,则将它们放在 \Debug 或 \x64\Debug 中似乎是合乎逻辑的。

有时您无法重新编译或移动DLL内容。在这种情况下,请右键单击解决方案中的项目,菜单属性,选择配置,链接器,常规和输入。在那里,您可以指定其他库子目录和其他库。

结束提示:关于这个"配置解决方案">评论......你来自CMake世界,你习惯于手动编辑配置内容。不要在VS中为此烦恼。将.sln内部留给 VS,只需使用 VS-2017 UI 来维护即可。

我们使用 MSBuild 对 props 文件的支持。

props 文件(例如包含库路径的 envdeppaths.x64.user.props(:

<Project DefaultTargets="Build" ...>
<PropertyGroup Label="EnvDependentPaths">
<!-- base directory of boost to be used -->
<BoostDir>c:devlibsboost</BoostDir>
...

这些文件包含库路径(在某些情况下,标头和二进制文件是分开的(, 预处理器定义需要等。

它们在项目文件中导入,如下所示:

<Project DefaultTargets="Build" ...
<ItemGroup Label="ProjectConfigurations">
<ImportGroup Label="EnvDependentPaths">
<Import Project="$(SolutionDir)envdeppaths.$(Platform).user.props" 
Condition="exists('$(SolutionDir)envdeppaths.$(Platform).user.props')" 
Label="EnvDependentPaths" />
</ImportGroup>
...
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<AdditionalIncludeDirectories>$(BoostDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
...

但是,这种方法有一些缺点:

  • 需要手动编辑项目文件
  • 道具文件
  • 不能简单地签入VCS,所以干净的检出需要手动放置道具文件

当然还有其他方法。Visual Studio 包含配置管理器中生成属性的编辑器,无需手动编辑。

我在几个地方看到的是将库作为项目的一部分放在源代码管理中,放在一个单独的文件夹下,例如/extern/。

然后,在项目的包含和 lib dirs 设置中使用相对路径来引用此外部路径

通过这种方式,您可以很好地控制编译项目所依据的库版本,并且新版本的集成可以在源代码管理存储库中提交一次。