我使用 VCPKG 构建第三方库,例如 libcurl。我有动态和静态构建。显然,导入.lib和对象.lib文件分别包含在两个不同的文件夹中,x64-windows和x64-windows-static。
我想将对象 libcurl.lib 与我的程序静态链接,但无法弄清楚如何配置 Visual Studio 来执行此操作。它总是最终使用导入库,而不是对象库,因此我的程序最终在执行时需要 libcurl.dll。
我已将主项目配置为使用 /MT 运行时库。
我尝试配置链接器以使用指向静态 lib 文件夹的附加库文件夹和附加依赖项。
我什至尝试在链接器附加依赖项中使用对象 libcurl.lib 文件的完整路径。
当我对运行时库使用 /MT 开关时,我可以通过 Dependency Walker 得知所有常规库(如 vcruntime)都集成在可执行文件中,而不是作为 DLL 加载,但 libucurl.dll 仍然存在,动态加载。
似乎由于 VCPKG 自动包含路径集成,Visual Studio 总是首先找到并使用导入 libcurl.lib,即使我在链接器输入中指定了对象 libcurl.lib 的完整路径。
如何配置 Visual Studio 以静态链接正确的 .lib 文件?
好的,我为可能遇到同样问题的人找到了解决方案。
默认情况下,Visual Studio 使用 x64-windows 或 x86-windows“三元组”
您可以通过将 MSBuild 详细程度设置为“正常”或更高来查看自动推导的三元组:
快捷键:Ctrl+Q“构建并运行”
工具 -> 选项 -> 项目和解决方案 -> 生成并运行 -> MSBuild 项目生成输出详细信息
要覆盖自动选择的三元组并使用 x64-windows-static 或 x86-windows-static,您可以通过将 MSBuild 属性 VcpkgTriplet 添加到全局 PropertyGroup 来指定 .vcxproj 中的 MSBuild 属性 VcpkgTriplet。
<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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)