15

コンパイル中にプロジェクト グループが使用するパスを追加しようとしています。C++ Builder 2010msbuildを使用しているため、そのドキュメントを調べてみましたが、それによると、AdditionalLibPathsはプロパティとして渡すことができるはずです。すなわち

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

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

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

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

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

アップデート:

C++ BuilderはIncludePathILINK_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 ...インクルードパスとlibパスを追加するために設定する公式のプロパティはありませんか?

4

4 に答える 4

11

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 が追加されているように見えます。

于 2015-01-23T05:37:09.127 に答える
1

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

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

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

于 2016-02-03T20:41:50.057 に答える