6

例如,我使用 VCPKG 构建第三方库,例如 libcurl。我有动态和静态构建。显然,import .lib 和 object .lib 文件分别包含在两个不同的文件夹中,x64-windows 和 x64-windows-static。我想将对象 libcurl.lib 与我的程序静态链接,但无法弄清楚如何配置 Visual Studio 来做到这一点。它总是最终使用导入库,而不是对象库,因此我的程序最终在执行时需要 libcurl.dll。

我已将主项目配置为使用 /MT 运行时库。我尝试将链接器配置为使用指向静态库文件夹和其他依赖项的其他库文件夹。我什至尝试在链接器附加依赖项中使用对象 libcurl.lib 文件的完整路径。

当我使用 /MT 切换运行时库时,我可以使用 Dependency Walker 来判断所有常规库(如 vcruntime)都集成在可执行文件中,而不是作为 DLL 加载,但 libucurl.dll 仍然存在,动态加载。

似乎由于 VCPKG 自动包含路径集成,Visual Studio 总是首先找到并使用导入 libcurl.lib,即使我在链接器输入中指定了对象 libcurl.lib 的完整路径。

如何配置 Visual Studio 以静态链接正确的 .lib 文件?

4

1 回答 1

6

好的,我为可能遇到相同问题的任何人找到了解决方案。

默认情况下,Visual Studio 使用 x64-windows 或 x86-windows “triplet”

您可以通过将 MSBuild 详细程度设置为 Normal 或更高来查看自动推导出的三元组:

快捷键:Ctrl+Q“构建并运行”

工具 -> 选项 -> 项目和解决方案 -> 构建和运行 -> MSBuild 项目构建输出详细程度

要覆盖自动选择的三元组并使用 x64-windows-static 或 x86-windows-static,您可以在 .vcxproj 中指定 MSBuild 属性 VcpkgTriplet,方法是将其添加到 Globals PropertyGroup。

<PropertyGroup Label="Globals">
  <!-- .... -->
  <VcpkgTriplet Condition="'$(Platform)'=='Win32'">x86-windows-static</VcpkgTriplet>
  <VcpkgTriplet Condition="'$(Platform)'=='x64'">x64-windows-static</VcpkgTriplet>
</PropertyGroup>

https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#with-msbuild

于 2019-10-23T14:57:38.337 回答