Подтвердить что ты не робот

Добавление дополнительной библиотеки и включение путей при компиляции из командной строки

Я пытаюсь добавить дополнительные пути, которые будут использоваться моей группой проектов во время компиляции. Поскольку С++ Builder 2010 использует msbuild, я пробовал посмотреть на документацию для этого, и в соответствии с тем, что я могу найти, дополнительныеLibPath должны быть проходимыми как свойство. то есть

msbuild /p:AdditionalLibPaths=C:\FooBar\Libs /t:build foo.groupproj

Но он не использует пути, которые я добавил. Ранее я заметил, что некоторые имена свойств различаются между VС++ и С++ Builder при передаче в msbuild и интересно, может ли С++ Builder использовать другое имя свойства для добавления дополнительных библиотек lib и include

Я не хочу заменять существующие пути, определенные в проекте, но добавлять дополнительные. Обоснованием этого является то, что когда проект строится на нашем сервере сборки, некоторые библиотеки находятся в стандартизованном месте, которое может отличаться от того, где оно было установлено на машине разработки.

msbuild acutally вызывает файл msbuild script, который, в свою очередь, вызывает дополнительные скрипты, включая теги .groupproj, используя тег. Я знаю, что при использовании тега создается новый экземпляр msbuild, поэтому я знаю, что мне нужно добавить свойство при выполнении этой задачи в моем script.

<MSBuild Targets="Build" Projects="..\Foo.groupproj" Properties="Config=Debug (property to add additional paths here!)" />

Update:

С++ Builder, похоже, использует IncludePath и ILINK_LibraryPath, но при этом они переписывают пути, уже определенные в файле проекта. Поскольку этот файл создается и поддерживается средой IDE, поэтому любые изменения, сделанные им для добавления вместо перезаписывания, будут перезаписаны средой IDE. Это странно, потому что похоже, что оно должно действительно добавлять значения

<IncludePath>..\FooBar\;$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;Common Components;..\Config\Config32;$(IncludePath)</IncludePath>

Обновление 2:

В CodeGear.Cpp.Targets я добавил свое собственное свойство под названием AdditionalIncludePaths в скриптинг PropertyGroup с путями include.

Вокруг строки 251

<PropertyGroup>
        <BCC_NoLink>true</BCC_NoLink>
        <ILINK_OSVersion Condition="'$(ILINK_OSVersion)'=='' And '$(NoVCL)'!='true'">5.0</ILINK_OSVersion>
        <DCC_GenerateCppFiles>true</DCC_GenerateCppFiles>
        <ShowStdOut Condition="'$(ShowStdOut)'==''">$(ShowGeneralMessages)</ShowStdOut>

        <!-- _TCHAR mapping for Uni^H^H^H character selection -->
        <StartupObj Condition="'$(_TCHARMapping)'=='wchar_t'">$(StartupObj)w</StartupObj>
        <ILINK_StartupObjs Condition="'$(ILINK_StartupObjs)'==''">$(StartupObj)</ILINK_StartupObjs>
        <BCC_GenerateUnicode Condition="'$(_TCHARMapping)'=='wchar_t'">true</BCC_GenerateUnicode>
        <!-- Include Paths -->
        <Win32LibraryPath Condition="'$(Win32LibraryPath)'==''">$(BDS)\lib</Win32LibraryPath>
        <IncludePath Condition="'$(CBuilderIncludePath)'!=''">$(IncludePath);$(CBuilderIncludePath)</IncludePath>
                <IncludePath Condition="'$(AdditionalIncludePath)'!=''">$(IncludePath);$(AdditionalIncludePath)</IncludePath>
        <BCC_IncludePath Condition="'$(BCC_IncludePath)'!=''">$(BCC_IncludePath);$(IncludePath)</BCC_IncludePath>
        <BCC_IncludePath Condition="'$(BCC_IncludePath)'==''">$(IncludePath)</BCC_IncludePath>
        <BRCC_IncludePath Condition="'$(BRCC_IncludePath)'!=''">$(BRCC_IncludePath);$(IncludePath)</BRCC_IncludePath>
        <BRCC_IncludePath Condition="'$(BRCC_IncludePath)'==''">$(IncludePath)</BRCC_IncludePath>
        <DCC_IncludePath Condition="'$(DCC_IncludePath)'!=''">$(DCC_IncludePath);$(IncludePath)</DCC_IncludePath>
        <DCC_IncludePath Condition="'$(DCC_IncludePath)'==''">$(IncludePath)</DCC_IncludePath>
        <DCC_UnitSearchPath>$(DCC_IncludePath);$(Win32LibraryPath)</DCC_UnitSearchPath>
        <DCC_ResourcePath>$(DCC_IncludePath)</DCC_ResourcePath>
        <DCC_ObjPath>$(DCC_IncludePath)</DCC_ObjPath>
        <TASM_IncludePath Condition="'$(TASM_IncludePath)'!=''">$(TASM_IncludePath);$(IncludePath)</TASM_IncludePath>
        <TASM_IncludePath Condition="'$(TASM_IncludePath)'==''">$(IncludePath)</TASM_IncludePath>

Тогда я могу позвонить

msbuild /t:build /p:AdditionalIncludePaths=C:\Foo\Include foo.groupproj

Это прекрасно работает и делает то, что я хочу. Я просто должен сделать то же самое с библиотечными путями. Но я не хочу, чтобы это взломало один из файлов, предоставленных Embarcaderos. Это просто смешно: P... Не существует ли какой-либо официальной собственности для добавления путей включения и путей lib?

4b9b3361

Ответ 1

Для VS2013 просто определите переменные среды перед запуском msbuild:

set "INCLUDE=%additional_include_path%;%INCLUDE%"
set "LIB=%additional_lib_path%;%LIB%"
REM use environment variables for INCLUDE and LIB values
set UseEnv=true

Ссылка: MSBuild/Microsoft.Cpp/v4.0/V120/Microsoft.Cpp.targets

<Target Name="SetBuildDefaultEnvironmentVariables"
        Condition="'$(UseEnv)' != 'true'">
...
    <SetEnv Name   ="INCLUDE"
        Value  ="$(IncludePath)"
        Prefix ="false" >
       <Output TaskParameter="OutputEnvironmentVariable"             PropertyName="INCLUDE"/>
    </SetEnv>

Но выглядит как INCLUDE и LIB, добавленные за дополнительными каталогами include/lib, указанными в свойствах проекта.

Ответ 2

В С++ Builder 10 Seattle (текущая версия с 2016 года) мне удалось решить эту проблему (например, добавить собственные пути библиотек в автоматическую сборку), добавив дополнительные пути библиотеки в переменную среды ILink_LibraryPath перед запуском msbuild. Это нужно сделать set ILink_LibraryPath=..., а не передавая свойство как /p:... в msbuild.

Это обеспечивает дополнительные пути в среде автоматической сборки без замены существующих путей, уже установленных в файлах .cbproj, и не требует каких-либо взломов в файлах, поставляемых Embarcadero.

Единственная проблема с этим подходом заключается в том, что последовательность, в которой проверяются отдельные пути, не гарантируется, т.е. пользовательские пути, предоставленные через переменную среды, добавляются к пути .cbproj или, возможно, помещаются посередине, в зависимости от настройки проекта, и не обязательно ставить перед собой, поэтому вам нужно быть осторожными, чтобы не иметь конфликтующих библиотек в других каталогах, упомянутых в файлах проектов.