混合C和C ++库

时间:2014-04-03 01:04:04

标签: c++ c gnu

我在构建用C ++编码的可执行文件时遇到了一个奇怪的问题,它使用的C ++库本身依赖于C库。我使用gcc和使用g ++的所有其他源模块编译了构成C库的C模块。 C和C ++库都是静态库。

当我在C ++源代码中包含来自C库的头文件时,我将其包装在extern" C":

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

现在奇怪的是得到&#34;未定义的引用&#34;链接时出错,但这些更改取决于我列出库的顺序:

  • 如果我首先列出C库,那么C ++模块引用的该库中的所有符号都显示为&#34; undefined&#34;。
  • 如果我首先列出C ++库,那么C ++模块引用的该库中的所有符号都显示为&#34; undefined&#34;。

我本以为在g ++命令行中出现静态库的顺序是完全不相关的。有人有任何线索吗?

2 个答案:

答案 0 :(得分:7)

订单很重要。

如果libxxx依赖于libyyy,则应首先指定libxxx,即-lxxx -lyyy

在不幸的情况下,当两者相互依赖时,可能会提到两个库两次

-lxxx -lyyy -lxxx

请参阅:

答案 1 :(得分:2)

不是多次列出库(如果存在许多相互依赖的库,这可能很麻烦),可以依靠GNU ld来做正确的事情并来回搜索库列表,直到所有符号都被解析。这是使用start_group / end_group命令行开关实现的:

g++ <...flags...> -Wl,--start-group -lxxx -lyyy -Wl,--end-group <...other flags...>

或直接提供档案,如果它们恰好以&#34;不符合&#34;方式:

g++ <...flags...> -Wl,--start-group xxx.a yyy.a -Wl,--end-group <...other flags...>

为这样一个简洁的功能付出的代价是链接速度降低,在很多情况下,这并不重要。