例如,我使用VCPKG构建像libcurl这样的第三方库。我有动态和静态版本。显然,import .lib和object .lib文件包含在两个不同的文件夹中,分别是x64-windows和x64-windows-static。我想将对象libcurl.lib与我的程序静态链接,但无法弄清楚如何配置Visual Studio来执行此操作。它总是最终使用导入库而不是对象库,因此我的程序最终在执行时需要libcurl.dll。
我已将主项目配置为使用/ MT运行时库。我尝试将链接器配置为使用指向静态lib文件夹和其他依赖项的其他库文件夹。我什至尝试在链接器其他依赖项中使用对象libcurl.lib文件的完整路径。
当我/ MT切换运行时库时,我可以通过使用Dependency Walker来告知,所有常规库(如vcruntime)都集成在可执行文件中,而不是作为DLL加载,但是libucurl.dll仍然存在,可以动态加载。
似乎由于VCPKG自动包含路径集成,即使我在链接器输入中指定了对象libcurl.lib的完整路径,Visual Studio也会始终首先查找并使用导入libcurl.lib。
如何配置Visual Studio以静态链接正确的.lib文件?
[好,我找到了可能遇到相同问题的任何人的解决方案。
默认情况下,Visual Studio使用x64-windows或x86-windows“ triplet”
您可以通过将MSBuild的详细程度设置为“普通”或更高级别来查看自动推断的三元组:
快捷方式:Ctrl + Q“构建并运行”
工具->选项->项目和解决方案->生成并运行-> MSBuild项目生成输出详细信息
要覆盖自动选择的三元组并使用x64-windows-static或x86-windows-static,您可以在.vcxproj中通过将其添加到Globals PropertyGroup中来指定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