我正在尝试添加我的项目组在编译期间使用的其他路径。由于 C ++ Builder 2010 使用 msbuild ,我已经尝试查看文档,并根据我能找到的内容 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 ++ 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路径?
答案 0 :(得分:10)
对于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。
答案 1 :(得分:1)
在C ++ Builder 10 Seattle(截至2016年的当前版本)中,我能够通过在运行之前将其他库路径放入环境变量ILink_LibraryPath
来解决此问题(即在自动构建中添加自定义库路径) msbuild
。这必须由set ILink_LibraryPath=...
完成,而不是将属性/p:...
传递给msbuild
。
这可以在自动构建环境中实现其他路径,而无需替换已在.cbproj文件中设置的现有路径,并且不需要Embarcadero提供的文件中的任何hack。
这种方法的唯一问题是不能保证检查各个路径的顺序 - 即通过环境变量提供的自定义路径附加到.cbproj路径或可能放在中间,具体取决于项目设置,并且不一定放在前面,所以你需要小心不要在项目文件中提到的其他目录中有冲突的库。
答案 2 :(得分:0)
对于 VS2019 上的附加 include
,请使用开关 /p:IncludePath=C:\Foo
答案 3 :(得分:0)
对于 VS2019,我已经测试过 msbuild
,它不会应用 INCLUDE
和 LIB
的这些环境变量,即使您已经设置了它们。根本原因可能是 msbuild
在加载和编译 INCLUDE
或 LIB
时覆盖了 *.sln
和 *.vcxproj
。然而,这只是我的假设,因为关于 windows/msbuild 的在线文档很难找到底层原因。
方案A:
在我的解决方案中,我使用 CL
和 LINK
环境变量在 msbuild
构建项目之前将包含目录和 lib 目录设置为:
set $env:CL="/I\C:\users\user\local\include"
set $env:LINK="/LIBPATH:C:\users\user\local\lib"
...
msbuild *.vcxproj
更多关于 CL
的信息,请访问 MSVC compiler environment variables
在 MSVC Linker environment variables
LINK
方案B:
对于您已经指出的另一种可能的解决方案,您可以将选项传递给 msbuild
,例如:
msbuild *.vcxproj /nologo /p:AdditionalIncludePaths="C:\users\user\local"
msbuild *.vcxproj /nologo /p:IncludePath="C:\users\user\local"