【发布时间】:2021-10-11 10:49:41
【问题描述】:
我想在我的 Visual Studio 2019 C++ 项目中使用两个配置,假设我想将 Debug 重命名为 Debug-A 并基于 Debug-A 添加一个名为 Debug-B 的新配置。
@987654328 @ 和Debug-B 仅在一个定义符号上有所不同,假设一个有SYMBOL_A,另一个有SYMBOL_B。
目前,我不关心 Release 以及 x64 以外的任何内容。
在我添加 NuGet 包(例如 fmt)之前,它可以正常工作。然后,当我尝试编译时,我得到未定义的符号链接器错误。就像没有包含fmtd.lib一样,如果我手动包含它(或将项目配置名称更改为Debug),问题就消失了。
如果我的项目配置名为Debug,我知道 NuGet 包含它的原因。查看 nuget 包目标文件 (packages/fmt.7.0.1/build/fmt.targets) - lib 文件被硬编码为 $(Configuration) 是 Debug 或 Release。
据我所知,所有的 NuGet C++ 包都是这样构建的。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- ... -->
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<Link>
<AdditionalDependencies>fmtd.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Lib>
<AdditionalDependencies>fmtd.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<Link>
<AdditionalDependencies>fmt.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Lib>
<AdditionalDependencies>fmt.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Lib>
</ItemDefinitionGroup>
<!-- ... -->
</Project>
我知道我可以手动链接库,但 fmt 只是一个示例,我使用了很多包,手动链接很快就会成为问题。
有什么方法可以使用活动解决方案配置(工具栏下拉菜单)提供的预处理器符号的快速选择,并且仍然能够正确使用 NuGet?例如,使用伪造的 $(Configuration) 变量解析 nuget 文件。使用$(Platform)(x86、x64 等)是不可能的,库包含路径也取决于它的硬编码值。
【问题讨论】:
标签: visual-studio visual-c++ nuget visual-studio-2019