为什么Xcode 4.2为.cpp文件应用C文件构建规则脚本?

Why is Xcode 4.2 applying C files build rule script for .cpp files?

本文关键字:文件 构建 规则 脚本 应用 为什么 cpp Xcode      更新时间:2023-10-16

我有一个Xcode 4.2项目,其中包括一个windows交叉编译的目标。我对目标中的C源文件和c++源文件使用自定义构建规则,通过自定义脚本调用i386-pc-mingw32- c++。由于某些原因,Xcode运行自定义脚本,我已经指定为C源文件,即使在编译文件与。cpp扩展名。为什么会这样呢?我怎么能得到Xcode 4.2运行"c++源文件"脚本为我的。cpp文件?

我在这个项目中也有。c文件,我希望在编译c++文件时使用-std=c++11标志来启用一些c++11功能。如果我用这个标志编译。c文件,我最终会在math.h中包含的常量上出现奇怪的作用域问题,我还没有真正尝试和理解-我希望我能让Xcode为我的。cpp文件运行正确的脚本。

任何想法?

更新:我已经能够让Xcode运行正确的脚本。为此,我必须将Process下拉菜单选项从"C源文件"answers"c++源文件"都更改为"名称匹配的源文件",然后在提供的文本字段中手动输入*.c*.cpp。现在我必须弄清楚为什么我得到一个M_PI was not declared in this scope错误信息,我不是以前-也许是一个不同版本的数学。h正在使用-std=c++11标志,要么不包括M_PI常数或在不同的命名空间下提供它?

更新:继续对此进行工作-似乎我从math.h中使用的M_PI值实际上是一个宏,如果__STRICT_ANSI__尚未定义,则仅#定义。显然,通过使用-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')定义这个

如果你想在没有ANSI模式的情况下支持c++ 11,请使用-std=gnu++11代替std=c++11