我在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
符号的更多错误。WIN32
在PreprocessorDefinitions
中定义(PreprocessorDefinitions="WIN32;MORE_STUFF"
)
当我查看BuildLog.htm
文件时,我想我明白发生了什么:
Creating temporary file "c:foobuildRSP00001273601360.rsp" with contents
[
/GL /I "..include" /I "" /D "WIN32" /D "MORE_STUFF" …
"..srcfoo.c"
]
Creating command line "cl.exe @"c:foobuildRSP00001273601360.rsp" /nologo /errorReport:prompt"
似乎/I
后面跟着一个空参数,它不知何故消失了(被 Windows 命令行解析的怪癖吃掉了?或 Visual C++?),因此/D
成为/I
的参数,WIN32
成为操作数(编译器将其解释为源文件名)。(如果您认为我的解释不正确,请随时发表评论。
我确实需要该项目在定义EXTRA_INCLUDE_DIR
和未定义时都能工作,因为它用于在略有不同的情况下自动和手动构建。
如何拥有由环境变量指定的附加包含目录,并且在未定义此环境变量时不中断构建?
愚蠢的解决方法:
AdditionalIncludeDirectories=""..include";"$(EXTRA_INCLUDE_DIR).""
因此,当变量存在时,将搜索正确的目录;当变量不存在时,将搜索.
(即当前驱动器的根目录)。希望开发人员不会将寄生.h
文件存储在根目录中。