我有一个小程序,可以毫无困难地使用 GCC 和 ICC 进行编译,但我也希望代码可以与 G++ 和 ICPC 一起使用。我试图添加这个:
#ifdef __cplusplus
extern "C" {
#endif
一开始是这样的:
#ifdef __cplusplus
}
#endif
在所有头文件的末尾,但我仍然收到几个“未定义的对“...”的引用”错误。
我有一个小程序,可以毫无困难地使用 GCC 和 ICC 进行编译,但我也希望代码可以与 G++ 和 ICPC 一起使用。我试图添加这个:
#ifdef __cplusplus
extern "C" {
#endif
一开始是这样的:
#ifdef __cplusplus
}
#endif
在所有头文件的末尾,但我仍然收到几个“未定义的对“...”的引用”错误。
我认为您弄错了... extern C 用于禁用函数修饰;因此,如果您仅针对头文件执行此操作,则当您尝试链接损坏的目标代码时,声明的函数名称将与目标文件中的函数名称不匹配。
无论如何,如果整个应用程序正在使用相同的 C++ 编译器进行编译和链接,则外部 C 不会增加任何可移植性,它旨在将 C 库与 C++ 代码混合。
如果您的代码在 C 和 C++ 的公共子集中,您应该已经能够使用任一编译器对其进行编译,但我看不出这样做的原因(除了遵循最不意外的原则,因为 C++ 对一些东西)。
你会得到未定义的引用,因为如果你 put 声明和定义不匹配extern "C"
,这会阻止名称修改的发生:但在这种情况下,这只发生在你的头文件中。
请参阅我对之前这个问题的回答:何时用简单的词使用 extern "C"?
希望它可以清楚地说明如何混合 C 和 C++ 代码。
如果未定义的引用之一是 gxx_personality,那么我会说“fortran”的帖子是正确的。