【问题标题】:G++ complains "undefined reference to" while GCC succeedsG++ 在 GCC 成功时抱怨“未定义的引用”
【发布时间】:2014-10-26 22:45:34
【问题描述】:

我有一个调用一些库函数的程序。我可以成功地用 GCC 编译。但是,当我切换到 G++ 4.7 时(因为我需要在其中添加 C++ 代码),我得到了

undefined reference to <a function name here>

编译命令如下:

&lt;gcc or g++&gt; foo.c -o foo &lt;path-to-a-static-library&gt;.a -l&lt;the library&gt;

包含我调用的函数的库是用 C 编写的。

如何解决? 用 G++ 重新编译库?这很糟糕,因为我们有其他 C 程序使用该库。

【问题讨论】:

  • 名称修改!!!查找extern "C" ...
  • @πάνταῥεῖ 谢谢。我搜索了一个结果,例如“如果需要在 C++ 中使用,C 代码头应该包含在 extern 中”。那么,如果库中没有那个 extern C,我就无能为力了吗?
  • @PengZhang 在你的 C++ 代码中做 extern "C" { #include "library.h" }
  • 我建议将extern "C" { ... } 放入库头文件中,并由#ifdef __cplusplus 适当保护,以使其同时适用于C 和C++:允许迁移到C++ 至关重要。
  • extern "C" { #include "library.h" } 不是一个好主意,因为library.h 可能包含标准标头

标签: c++ c gcc g++


【解决方案1】:

如果您可以更改 C 库的标头,则应使用适当的 extern "C" 部分保护它们:

#ifdef __cplusplus
extern "C" {
#endif

/* C declarations for the library */

#ifdef __cplusplus
}
#endif

如果你绝对不能改变头文件,你应该确保你可以改变头文件。如果这仍然绝对不是一个选择,请更加努力。只有在遇到阻力的砖墙后,才能在 #include 指令周围添加 extern "C" 声明:

extern "C" {
#include "c-library-header.h"
}

extern "C" 放在#include 指令周围的方法的原因是它抑制了头文件将来迁移以包含C++ 功能:由于外部包含防护将散布在代码库周围,它变成当 C++ 功能出现在"c-library-header.h" 中时,修复它们是一场维护噩梦。对于当前的软件来说,这可能不是一个大问题,但任何成功的软件都倾向于增长,并且像删除 extern "C" 声明这样的迁移会成为问题。

【讨论】:

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