【问题标题】:Non-standard configuration names in C++ projects break NuGet linkingC++ 项目中的非标准配置名称会破坏 NuGet 链接
【发布时间】: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)DebugRelease
据我所知,所有的 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 等)是不可能的,库包含路径也取决于它的硬编码值。

Sample project with this bug.

【问题讨论】:

    标签: visual-studio visual-c++ nuget visual-studio-2019


    【解决方案1】:

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

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

    所以,为了覆盖.vcproj 文件的属性/项目。也许customize build 有效。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多