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

Posted

技术标签:

【中文标题】共享需要外部库的 Visual Studio 项目【英文标题】:Sharing a Visual Studio Project that requires External Libraries 【发布时间】:2018-07-01 02:32:47 【问题描述】:

我不是专业开发 C++ 或专业使用 Visual Studio 编程的开发人员。希望这个问题不会太琐碎。

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

" 因此,我想放弃 CMake 以使用标准的 MSBuild Visual Studio。我唯一的问题是如何创建我的解决方案文件,以便下一个编译我的代码的人不需要库和我在同一个地方?他们是否必须在加载解决方案时自己配置解决方案?这里的标准做法是什么。“

视情况而定。当可以从 NuGet 获取外部库时,这很容易。只需让 VS 恢复第一次构建的所有依赖项。文件将放在 Solution\packages 中。

如果有 DLL 的源代码要添加到解决方案中,特定于您的项目,您可以将它们包含在 Solution\Subdir 中,并且它们的目标 DLL 和 LIB 最终将在 Solution\Debug 或 \x64\Debug 中。

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

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

结束提示:关于此“配置解决方案” 备注.. 您来自 CMake 世界,习惯于手动编辑配置内容。不要在VS中为此烦恼。将 .sln 内部结构留给 VS,只需使用 VS-2017 UI 来维护。

【讨论】:

【参考方案2】:

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

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

<Project DefaultTargets="Build" ...>
  <PropertyGroup Label="EnvDependentPaths">
    <!-- base directory of boost to be used -->
    <BoostDir>c:\dev\libs\boost</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>
     ...

不过,这种方法有一些缺点:

需要手动编辑项目文件 props 文件不能简单地检入 VCS,因此干净检出需要手动放置 props 文件

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

【讨论】:

【参考方案3】:

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

然后你在你的项目的包含和库目录设置中使用相对路径来引用这个外部路径

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

【讨论】:

以上是关于共享需要外部库的 Visual Studio 项目的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010、SharePoint 2010、外部 Web 部件

如何在 Visual Studio 2017 项目中使用 modbus 库?

Visual Studio Code - Python 调试 - 执行时步入外部函数的代码

如何为 Visual Studio 项目构建 Qmake?专门用于 octomap 库的 QGLViewer

Visual Studio 2010 SP1 安装项目不安装 Visual C++ 2010 运行时库的 SP1

Visual Studio 2010 中 dlib 库的使用