web-dev-qa-db-ja.com

コマンドラインからコンパイルするときにライブラリとインクルードパスを追加する

コンパイル中にプロジェクトグループが使用するパスを追加しようとしています。 C++ Builder 2010msbuildを使用しているので、そのドキュメントを見て、見つけたものに従ってみましたAdditionalLibPathsはプロパティとして渡す必要があります。つまり、

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

しかし、私が追加したパスを使用していないようです。以前、msbuildに渡されたときに、一部のプロパティ名がVC++C++ Builderで異なることに気付き、C++ Builderは、他のプロパティ名を使用してlibを追加し、フォルダーを含めることができますか?

プロジェクトで定義されている既存のパスを置換したくありませんが、追加のパスを追加します。これの理論的根拠は、プロジェクトがビルドサーバー上でビルドされる場合、一部のライブラリは、開発マシンにインストールされている場所とは異なる可能性がある標準化された場所に存在するためです。

msbuildは、msbuildスクリプトファイルを実際に呼び出し、。groupprojタグを使用しているもの。タグを使用するとmsbuildの新しいインスタンスが作成されることを知っているので、スクリプトでそのタスクを実行するときにプロパティを追加する必要があることを知っています。

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

更新:

C++ BuilderIncludePathILINK_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インクルードパスをいじる。

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が提供するファイルの1つをハックする必要はありません。それはばかげています:P ...インクルードパスとライブラリパスを追加するために設定する公式のプロパティはありませんか?

14
inquam

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のように見えます。

11
zhifac

C++ Builder 10 Seattle(2016年現在のバージョン)では、msbuildを実行する前に、環境変数ILink_LibraryPathに追加のライブラリパスを追加することで、この問題を解決できました(つまり、自動ビルドにカスタムライブラリパスを追加しました)。これは、プロパティをset ILink_LibraryPath=...としてmsbuildに渡すのではなく、/p:...によって実行する必要があります。

これにより、.cbprojファイルにすでに設定されている既存のパスを置き換えることなく、自動ビルド環境で追加のパスが実現され、Embarcaderoが提供するファイルをハッキングする必要がありません。

このアプローチの唯一の問題は、個々のパスがチェックされる順序が保証されないことです。つまり、環境変数を介して提供されるカスタムパスは、プロジェクトの設定に応じて.cbprojパスに追加されるか、場合によっては中央に配置され、必ずしも配置されるとは限りません。そのため、プロジェクトファイルに記載されている他のディレクトリに競合するライブラリがないように注意する必要があります。

1
Cozzamara