首页 > 解决方案 > C++ 项目中的非标准配置名称会破坏 NuGet 链接

问题描述

我想在我的 Visual Studio 2019 C++ 项目中使用两个配置,假设我想重命名DebugDebug-A添加一个名为Debug-B基于Debug-A.
Debug-A并且Debug-B仅由一个定义符号不同,可以说一个 hasSYMBOL_A和另一个 has SYMBOL_B

目前,我不关心 Release 和 x64 以外的任何东西。

配置管理器

在我添加 NuGet 包(例如 fmt)之前,它可以正常工作。然后,当我尝试编译时,我得到未定义的符号链接器错误。就像fmtd.lib没有包含一样,如果我手动包含它(或将项目配置名称更改为Debug),问题就消失了。

如果我的项目配置被命名,我知道 NuGet 包含它的原因Debug。查看 nuget 包目标文件 ( packages/fmt.7.0.1/build/fmt.targets) - lib 文件被硬编码为$(Configuration)orDebugRelease.
据我所知,所有 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)(x86x64) 是不可能的,库包含路径也取决于它的硬编码值。

带有此错误的示例项目

标签: visual-studiovisual-c++nugetvisual-studio-2019

解决方案


如果如您所述,NuGet 包的 lib 文件是硬编码的,那么我们可能需要从其他方面寻找解决方案,例如.vcxproj文件或 MSBuild。

我没有找到任何直接满足您要求的属性/参数/方式。但是,是否可以保留Debug名称,我的意思是,将其命名为DebugnotDebug-ADebug-B,然后通过使用其他方法切换到使用不同的配置。想象有一个Debug配置文件(DebugB)(可能DebugB相关的东西都设置在这个文件里)项目中排除了,而项目当前使用了另一个Debug配置(DebugA),而在构建过程中,项目将完全使用DebugA配置。切换,做某事,或在.vcxproj文件中添加代码行以包含包含 DebugB 配置的文件,然后让 DebugB 配置覆盖 DebugA 配置。

所以,为了覆盖.vcproj文件的属性/项目。也许定制构建作品。

以上希望能给你一点帮助。


推荐阅读