问题 从命令行编译时添加其他库和包含路径


我正在尝试添加在编译期间由我的项目组使用的其他路径。以来 C ++ Builder 2010 使用 的MSBuild 我已经尝试查看文档并根据我能找到的内容 AdditionalLibPaths 应该可以作为财产通过。即

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

但它似乎没有使用我添加的路径。我之前注意到一些属性名称之间存在差异 VC ++ 和 C ++ Builder 什么时候传递给 的MSBuild 并且想知道是否 C ++ Builder 可能会使用其他一些属性名称来添加其他lib并包含文件夹?

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

的MSBuild 实际上是打电话给 msbuild脚本文件 然后调用其他脚本,包括 .groupproj 使用的人  标签。我知道一个新的实例 的MSBuild 是在使用时创建的  标记,所以我知道我必须在我的脚本中运行该任务时添加属性。

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

更新:

C ++ 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 摆弄包含路径。

在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路径?


1021
2018-03-27 07:50


起源



答案:


对于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目录后面。


10
2018-01-23 05:37





在C ++ Builder 10 Seattle(截至2016年的当前版本)中,我能够通过将额外的库路径放入环境变量来解决此问题(即在自动构建中添加自定义库路径) ILink_LibraryPath 在跑步之前 msbuild。这必须通过 set ILink_LibraryPath=...而不是通过传递财产 /p:... 至 msbuild

这样就可以在自动构建环境中实现其他路径,而无需替换已在.cbproj文件中设置的现有路径,并且不需要Embarcadero提供的任何文件。

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


1
2018-02-03 20:41



非常有用的答案,谢谢!关于这个环境变量,如果我们需要提供多个值路径,那么语法将如何? - nk-fford
@ nk-fford用分号分隔多个路径 - Cozzamara


答案:


对于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目录后面。


10
2018-01-23 05:37





在C ++ Builder 10 Seattle(截至2016年的当前版本)中,我能够通过将额外的库路径放入环境变量来解决此问题(即在自动构建中添加自定义库路径) ILink_LibraryPath 在跑步之前 msbuild。这必须通过 set ILink_LibraryPath=...而不是通过传递财产 /p:... 至 msbuild

这样就可以在自动构建环境中实现其他路径,而无需替换已在.cbproj文件中设置的现有路径,并且不需要Embarcadero提供的任何文件。

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


1
2018-02-03 20:41



非常有用的答案,谢谢!关于这个环境变量,如果我们需要提供多个值路径,那么语法将如何? - nk-fford
@ nk-fford用分号分隔多个路径 - Cozzamara