为什么不从共享库中找到一些符号

时间:2015-07-24 09:14:03

标签: c gcc linker shared-libraries

我有以下文件:

文件liba.c

#include <stdio.h>

void foo() {printf("foo\n"); }
void bar() {printf("bar\n"); }

文件libb.c

void foo();
void abc() { foo(); }

main.c

void abc();
void foo();
void bar();

int main()
{
   abc();
   foo();
   bar();
}

我正在编译文件如下:

gcc -shared -fPIC -o liba.so liba.c
gcc -shared -fPIC -Wl,-rpath,. -Wl,--no-undefined -o libb.so libb.c liba.so
gcc -Wl,-rpath,. main.c libb.so

现在,链接器在链接可执行文件时报告错误:

/usr/bin/ld: /tmp/cc4De1Xu.o: undefined reference to symbol 'bar'  
./liba.so: error adding symbols: DSO missing from command line  
collect2: error: ld returned 1 exit status  

现在的问题是:为什么链接器找不到符号 bar main.c 链接到 libb.so ,后者又链接到 liba.so liba.so 确实有符号 bar 。此外, main.c 使用符号 foo ,它也位于 liba.so 中,并且在链接期间可以找到它。

因此 liba.so 中定义了 foo bar 这两个符号,但只找到 foo 在链接期间。为什么呢?

看起来只找到 libb.so 中使用的符号 libb.so 。但为什么会这样呢?

1 个答案:

答案 0 :(得分:0)

我认为它与符号bar有关,而不是包含在 libb.so 的导出表中,而只包含在 liba.so 中。为什么不将main.c链接到 liba.so ? 否则,在 libb.c 中声明void bar();应该有帮助..