15

我正在尝试添加其他路径以供我的项目组在编译期间使用。由于C++ Builder 2010使用msbuild,我尝试查看文档,并根据我可以找到的内容,AdditionalLibPaths应该可以作为属性传递。IE

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

但它似乎没有使用我添加的路径。我之前注意到VC++C++ Builder之间的某些属性名称在传递给msbuild时会有所不同,并且想知道C++ Builder是否可能使用其他属性名称来添加额外的 lib 和包含文件夹?

我不想替换项目中定义的现有路径,而是附加其他路径。这样做的基本原理是,当项目在我们的构建服务器上构建时,一些库驻留在一个标准化的位置,可能与它在开发机器上的安装位置不同。

msbuild acutally 调用一个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 提供的文件之一。这太荒谬了:P ...没有任何官方属性可以设置用于添加包含路径和库路径吗?

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>

但看起来像是附加在项目属性中指定的附加包含/lib 目录后面的 INCLUDE 和 LIB。

于 2015-01-23T05:37:09.127 回答
2

有关includeVS2019 的附加信息,请使用开关/p:IncludePath=C:\Foo

要包含多个路径,请在开关上使用双引号和分号:

/p:IncludePath="C:\Foo;C:\Bar;C:\Another;$(IncludePath)"
于 2021-05-05T06:13:26.853 回答
1

在 C++Builder 10 Seattle(截至 2016 年的当前版本)中,我能够通过ILink_LibraryPath在运行msbuild. 这必须通过 来完成set ILink_LibraryPath=...,而不是通过传递属性/p:...来完成msbuild

这在自动构建环境中实现了额外的路径,无需替换已在 .cbproj 文件中设置的现有路径,并且不需要在 Embarcadero 提供的文件中进行任何修改。

这种方法的唯一问题是不能保证检查单个路径的顺序 - 即通过环境变量提供的自定义路径附加到 .cbproj 路径或可能放在中间,具体取决于项目设置,并且不一定放置在前面,因此您需要注意不要在项目文件中提到的其他目录中存在冲突的库。

于 2016-02-03T20:41:50.057 回答
0

对于VS2019,我已经测试msbuild它不会应用 and 的这些环境变量INCLUDELIB即使你已经设置了它们。根本原因可能是msbuild覆盖INCLUDELIB加载和编译时*.sln*.vcxproj. 但是,这只是我的假设,因为有关 windows/msbuild 的在线文档很难找到底层原因。

解决方案A:
在我的解决方案中,我在构建项目之前使用CLLINK环境变量将include目录和lib目录设置为:msbuild

set $env:CL="/I\C:\users\user\local\include"
set $env:LINK="/LIBPATH:C:\users\user\local\lib"
...
msbuild *.vcxproj

有关MSVC 编译器环境变量CL的更多 信息 有关MSVC 链接器环境变量的更多信息
LINK

解决方案 B:
对于您已经指出的另一种可能的解决方案,您可以将选项传递给msbuildlike:

msbuild *.vcxproj /nologo /p:AdditionalIncludePaths="C:\users\user\local"
msbuild *.vcxproj /nologo /p:IncludePath="C:\users\user\local"
于 2021-08-04T15:26:46.937 回答