我有一个Xcode 4.2项目,其中包括一个交叉编译窗口的目标。我在该目标中使用C源文件和C++源文件的自定义构建规则,通过自定义脚本调用i386-pc-mingw32-g ++。出于某种原因,即使在编译扩展名为.cpp的文件时,Xcode也会运行我为C源文件指定的自定义脚本。为什么会这样呢?我怎样才能让Xcode 4.2为我的.cpp文件运行“C++源文件”脚本?为什么Xcode 4.2应用C文件为.cpp文件构建规则脚本?
我在这个项目中也有.c文件,并且希望在编译C++文件时使用-std = C++ 11标志来启用一些C++ 11功能。如果我用这个标志编译.c文件,我最终会对math.h中包含的常量产生奇怪的范围问题,我还没有真正尝试和理解 - 我希望我可以让Xcode为我的运行正确的脚本.cpp文件。
任何想法?
更新:我已经能够让Xcode运行正确的脚本。为此,我必须将“C源文件”和“C++源文件”中的“过程”下拉菜单选项更改为“源文件名称匹配:”,然后在提供的文本字段中手动输入*.c
和*.cpp
。现在我必须弄清楚为什么我得到一个M_PI was not declared in this scope
错误消息,我之前没有 - 也许不同版本的math.h正在与-std = C++ 11标志一起使用,该标志或者不包含M_PI常量还是在不同的命名空间下提供它?
更新:继续在此工作 - 它看起来我从math.h使用的M_PI值实际上是一个宏,它只有#defined'd,如果__STRICT_ANSI__
尚未定义。显然通过使用-std = C++ 11编译器标志切换到C++ 11已经导致这个__STRICT_ANSI__
宏被定义,因此我之前使用的M_PI宏不存在。我想最好是定义我自己的pi常量,而不是混淆这个宏的声明,但我可能会深入探讨一下,以澄清为什么现在我正在使用C++ 11旗。
更新:我发现这个职位How can I make C++0x and __STRICT_ANSI__ get along?,这只是暗示 '-std = C++ 11' 标志后取消定义 'STRICT_ANSI' 宏右(或更确切地说,等效“-std =的C++ 0x 'flag。虽然这看起来很简单,但没有人发布过任何问题,因为它似乎也适用于我的情况。此宏中的Gcc文档位于:http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html,并附有以下相关声明:
宏STRICT_ANSI被预定义使用-ansi选项时,一些头文件可能会注意到此宏和避免从声明某些函数或定义ISO标准不要求的某些宏;这是为了避免干扰任何可能将这些名称用于其他事情的程序。
仍然不确定为什么'-std = C++ 11'标志会导致它在默认情况下被定义(这显然是'-std = C++ 98')。
不是肯定的,但我的猜测是Xcode更喜欢'* .cxx'命名约定。 – 2013-02-28 20:13:41
有趣的是,如果将鼠标悬停在列表中的“C源文件”和“C++源文件”条目上,则会分别得到一个说“sourcecode.c”和“sourcecode.cpp”的小工具提示。 – thamoonisdown 2013-02-28 20:36:46