Я пытаюсь сделать .targets
файл для моего пакета NuGet, который будет ссылаться на правильный .lib
файл в зависимости от библиотеки времени выполнения C ++ проекта. Этот ответ рекомендует использовать %(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
не определено Как мне сделать эту работу для условий?
Вместо этого попробуйте следующее:
<PropertyGroup>
<RuntimeLibrary>@(ClCompile->'%(RuntimeLibrary)')</RuntimeLibrary>
</PropertyGroup>
Использование символа @ позволяет ссылаться на списки элементов.
Существует также пример на StackOverflow.