我试图为我的NuGet包创建一个.targets
文件,该文件将链接到一个正确的.lib
文件,具体取决于项目的C ++运行时库。 This answer建议为此使用%(ClCompile.RuntimeLibrary)
元数据。但似乎无法在<Target>
节点之外访问元数据!并且库依赖项添加在根<ItemDefinitionGroup>
节点下的<Project>
节点中。
这是SSCCE:
<?xml version="1.0" encoding="us-ascii"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="main.cpp">
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
</ItemGroup>
<PropertyGroup>
<RuntimeLibrary>%(ClCompile.RuntimeLibrary)</RuntimeLibrary>
</PropertyGroup>
<Target Name="Build">
<Message Text="Property = $(RuntimeLibrary)" Importance="high" />
<Message Text="Metadata = %(ClCompile.RuntimeLibrary)" Importance="high" />
</Target>
</Project>
使用MsBuild运行它会产生:
Property = %(ClCompile.RuntimeLibrary)
Metadata = MultiThreadedDebugDLL
同一语句%(ClCompile.RuntimeLibrary)
在<Target>
节点内使用时会扩展为该值,但在<PropertyGroup>
节点外<Target>
节点中使用时则不会。
那么如何访问运行时库元数据值以添加引用正确的库?
更新:建议但不满意的解决方法是定义RuntimeLibrary
,如下所示:
<RuntimeLibrary>@(ClCompile->'%(RuntimeLibrary)')</RuntimeLibrary>
在这种情况下,初始脚本的输出是正确的,但我的任务仍未解决,因为我想在条件中使用此属性。所以,如果我添加以下内容:
<PropertyGroup Condition="'$(RuntimeLibrary)'=='MultiThreadedDebugDLL'">
<TestProp>defined</TestProp>
</PropertyGroup>
...
<Message Text="TestProp = $(TestProp)" Importance="high" />
TestProp
未定义。如何使这项工作符合条件?
答案 0 :(得分:1)
请尝试以下方法:
<PropertyGroup>
<RuntimeLibrary>@(ClCompile->'%(RuntimeLibrary)')</RuntimeLibrary>
</PropertyGroup>
使用@符号可以引用项目列表。