我有一个 Xcode 4.2 项目,其中包括一个为 windows 交叉编译的目标。我对该目标中的 C 源文件和 C++ 源文件使用自定义构建规则,通过自定义脚本调用 i386-pc-mingw32-g++。出于某种原因,Xcode 会运行我为 C 源文件指定的自定义脚本,即使在编译扩展名为 .cpp 的文件时也是如此。为什么会这样?如何让 Xcode 4.2 为我的 .cpp 文件运行“C++ 源文件”脚本?
我在这个项目中也有 .c 文件,我希望在编译 c++ 文件时使用 -std=c++11 标志来启用一些 c++11 功能。如果我用这个标志编译 .c 文件,我最终会遇到关于 math.h 中包含的常量的奇怪范围问题,我还没有真正尝试和理解 - 我希望我可以让 Xcode 为我的运行正确的脚本.cpp 文件。
有任何想法吗?
更新:我已经能够让 Xcode 运行正确的脚本。为此,我必须将 Process 下拉菜单选项从“C 源文件”和“C++ 源文件”都更改为“名称匹配的源文件:”,然后在提供的文本字段中手动输入*.c
和。*.cpp
现在我必须弄清楚为什么我会收到一条M_PI was not declared in this scope
以前没有的错误消息——也许不同版本的 math.h 正在与 -std=c++11 标志一起使用,该标志要么不包括 M_PI常量还是在不同的命名空间下提供它?
更新:继续解决这个问题 - 看来我从 math.h 使用的 M_PI 值实际上是一个宏,如果__STRICT_ANSI__
没有定义,它只是#define'd。显然,通过使用 -std=c++11 编译器标志切换到 c++11 导致该__STRICT_ANSI__
宏被定义,因此我之前使用的 M_PI 宏不存在。我想最好只定义我自己的 pi 常量而不是弄乱这个__STRICT_ANSI__
宏的声明,但我可能会深入研究一下,只是为了澄清为什么现在我正在使用 c++11 来声明它旗帜。
更新:我发现这篇文章如何让 C++0x 和 __STRICT_ANSI__ 相处?,这只是建议在 '-std=c++11' 标志之后取消定义' STRICT_ANSI ' 宏(或者更确切地说,等效的 '-std=c++0x' 标志。虽然这看起来很粗略,但没有人发布遇到因为它的任何问题,在这种情况下它似乎对我来说也很好。关于这个宏的 Gcc 文档位于:http: //gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html,并附上以下相关声明:
宏STRICT_ANSI是在使用 -ansi 选项时预定义的。一些头文件可能会注意到这个宏,并避免声明某些函数或定义 ISO 标准不要求的某些宏;这是为了避免干扰任何可能将这些名称用于其他用途的程序。
仍然不确定为什么'-std = c++ 11'标志会导致它在默认情况下被定义(显然是'-std = c ++ 98')。