我在构建用C ++编码的可执行文件时遇到了一个奇怪的问题,它使用的C ++库本身依赖于C库。我使用gcc和使用g ++的所有其他源模块编译了构成C库的C模块。 C和C ++库都是静态库。
当我在C ++源代码中包含来自C库的头文件时,我将其包装在extern" C":
extern "C"
{
#include <c-library-header.h>
}
现在奇怪的是得到&#34;未定义的引用&#34;链接时出错,但这些更改取决于我列出库的顺序:
我本以为在g ++命令行中出现静态库的顺序是完全不相关的。有人有任何线索吗?
答案 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...>
为这样一个简洁的功能付出的代价是链接速度降低,在很多情况下,这并不重要。