1

我在 Visual C++ 2008 中有一个项目,其中包含目录的名称来自环境变量:

AdditionalIncludeDirectories=""..\include";"$(EXTRA_INCLUDE_DIR)""

(项目属性 → 配置属性 → C/C++ → 常规 → GUI 中的附加包含目录)

未定义环境变量时EXTRA_INCLUDE_DIR,项目无法编译,并且出现奇怪的错误:。

1>Compiling...
1>WIN32
1>c1 : fatal error C1083: Cannot open source file: 'WIN32': No such file or directory
1>foo.c

以及更多错误表明WIN32符号未定义。WIN32PreprocessorDefinitions( PreprocessorDefinitions="WIN32;MORE_STUFF")中定义

当我查看BuildLog.htm文件时,我想我明白发生了什么:

Creating temporary file "c:\foo\build\RSP00001273601360.rsp" with contents
[
/GL /I "..\include" /I "" /D "WIN32" /D "MORE_STUFF" …
"..\src\foo.c"
]
Creating command line "cl.exe @"c:\foo\build\RSP00001273601360.rsp" /nologo /errorReport:prompt"

似乎/I后面是一个空参数,它以某种方式消失了(被 Windows 命令行解析的怪癖吃掉了?还是 Visual C++ 的?),因此/D成为参数/IWIN32成为操作数(编译器将其解释为源文件姓名)。(如果您认为我的解释不正确,请随时发表评论。)

我确实需要该项目在EXTRA_INCLUDE_DIR定义和未定义时都可以工作,因为它在稍微不同的情况下用于自动和手动构建。

我怎样才能有一个由环境变量指定的附加包含目录,并且在未定义此环境变量时不破坏构建?

4

1 回答 1

2

愚蠢的解决方法:

AdditionalIncludeDirectories=""..\include";"$(EXTRA_INCLUDE_DIR)\.""

因此,当变量存在时,将搜索正确的目录;当变量不存在时,\.(即当前驱动器的根目录)被搜索。希望开发人员不要将寄生.h文件存储在根目录中。

于 2012-12-14T12:58:36.260 回答