【问题标题】:C code compiled with C++: undefined reference用 C++ 编译的 C 代码:未定义的引用
【发布时间】:2011-02-19 02:47:13
【问题描述】:

我有一个小程序,我可以使用 GCC 和 ICC 毫无困难地编译,但我也希望代码可以使用 G++ 和 ICPC。我试图添加这个:

#ifdef __cplusplus
  extern "C" {
#endif

开头是这样的:

#ifdef __cplusplus
  }
#endif

在所有头文件的末尾,但我仍然收到几个“未定义对“...”的引用”错误。

【问题讨论】:

标签: c++ c include undefined-reference


【解决方案1】:

我认为你弄错了... extern C 用于禁用函数修饰;因此,如果您仅针对头文件执行此操作,则当您尝试链接损坏的目标代码时,声明的函数名称将与目标文件中的函数名称不匹配。

无论如何,如果整个应用程序正在使用相同的 C++ 编译器进行编译和链接,extern C 将不会增加任何可移植性,它旨在将 C 库与 C++ 代码混合。

如果您的代码在 C 和 C++ 的公共子集中,您应该已经能够使用任一编译器对其进行编译,但我看不出这样做的原因(除了遵循最小意外原则,因为 C++ 是对某些事情更严格)。

【讨论】:

    【解决方案2】:

    如果您输入 extern "C",您会得到未定义的引用,因为声明和定义不匹配,这可以防止发生名称修改:但在这种情况下,这只发生在您的头文件中。

    【讨论】:

      【解决方案3】:

      如果未定义的引用之一是 gxx_personality,那么我会说“fortran”的帖子是正确的。

      【讨论】:

      • 与 gxx_personality 无关,我只得到两个相当简单的函数的未定义引用。 “未定义函数”之一在文件“a.h/a.c”中,可以在这些文件中正确使用,但由于某种原因在文件“b.c”中不起作用。
      【解决方案4】:

      查看我对之前这个问题的回复:When to use extern "C" in simple words?

      希望它能够阐明如何混合 C 和 C++ 代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多