只有.h在某个目录中时,c-g才会神秘地失败
我在新的OSX 10.4.11
Xcode 2.5安装中遇到了一个非常奇怪的问题.我把它减少到一个最小的测试用例.这是test.cpp:
#include "macros.h" int main (void) { return 1; } 这是macros.h: #ifndef __JUST_TESTING__ #define __JUST_TESTING__ template<typename T> void swap (T& pT1,T& pT2) { T pTmp = pT1; pT1 = pT2; pT2 = pTmp; } #endif //__JUST_TESTING__ 如果两个文件都在同一目录中,则编译并正常工作.但是,如果我将macros.h放在/usr/include / gfc2(它是我使用的自定义库的一部分)并更改test.cpp中的#include,则编译失败并显示以下错误: /usr/include/gfc2/macros.h:4: error: template with C linkage 我研究了这个错误,大多数评论都指向了一个“悬空的外部C”,这似乎根本就不是这样. 我在这里完全失败了.是g出于某种原因假设/usr/include / gfc2中的所有内容都是C,即使它包含在一个.cpp文件中,它不会在任何地方说“ex”? 有任何想法吗? 编辑:如果我使用#include中的完整路径,它会编译,即#include“/usr/include/gfc2/macros.h” EDIT2:它没有包含错误的标题.我已经使用cpp,g -E验证了这一点,并将macros.h重命名为foobarmacros.h 解决方法
G可能确实假设/usr/include中的所有内容都是C.尝试使用-E编译代码并研究预处理器输出中的行标记:
g++ -E test.cpp | grep '^#' 你可能会看到类似的东西 # 1 "/usr/include/gfc2/macros.h" 1 3 4 4是预处理器暗示G它应该将所有内容包装在extern“C”中,假设您的平台的/ usr /中的古代头文件包含在前C中.请参阅CPP手册中的Preprocessor Output. 这些天G大多忽略了这个提示,因为大多数平台的C头不再是古老的.请参阅GCC Internals手册中的NO_IMPLICIT_EXTERN_C目标宏.但可能是这个旧版本的Xcode配置了没有NO_IMPLICIT_EXTERN_C的GCC,因此正在监听预处理器的提示. (这是在GCC本身构建时设置的 – 我不认为有一个命令行开关来覆盖它.) 您可以通过将头文件的内容包装在extern“C”中来解决此问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |