visual-studio - C++ 项目中的非标准配置名称会破坏 NuGet 链接
问题描述
我想在我的 Visual Studio 2019 C++ 项目中使用两个配置,假设我想重命名Debug
并Debug-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)
orDebug
或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
) 是不可能的,库包含路径也取决于它的硬编码值。
解决方案
如果如您所述,NuGet 包的 lib 文件是硬编码的,那么我们可能需要从其他方面寻找解决方案,例如.vcxproj
文件或 MSBuild。
我没有找到任何直接满足您要求的属性/参数/方式。但是,是否可以保留Debug
名称,我的意思是,将其命名为Debug
notDebug-A
或Debug-B
,然后通过使用其他方法切换到使用不同的配置。想象有一个Debug配置文件(DebugB)(可能DebugB相关的东西都设置在这个文件里)项目中排除了,而项目当前使用了另一个Debug配置(DebugA),而在构建过程中,项目将完全使用DebugA配置。切换,做某事,或在.vcxproj
文件中添加代码行以包含包含 DebugB 配置的文件,然后让 DebugB 配置覆盖 DebugA 配置。
所以,为了覆盖.vcproj
文件的属性/项目。也许定制构建作品。
以上希望能给你一点帮助。
推荐阅读
- angular - 嵌套服务中的 Angular 嵌套 observable - 如何
- hive - 在 apache hive 的维度表中具有代理键或 nk+effective_time 是否更好
- javascript - React 应用程序 - 在后台渲染提要
- kubernetes - coredns 容器在 kubernetes 工作节点中反复重启
- powershell - 如何从字符串中仅提取版本号
- linux - 仅删除文件名中至少包含一位数字的文件而不是目录
- c++ - 调用 mongocxx::instance 返回“mongoc: 无法初始化 OpenSSL”
- c# - 将东/北转换为纬度 Lng
- ruby-on-rails - Ruby on Rails 扩展 gem 的类并更改其继承类
- php - 使用干预在 laravel 中上传图像