我有以下文件:
文件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 。但为什么会这样呢?
答案 0 :(得分:0)
我认为它与符号bar
有关,而不是包含在 libb.so 的导出表中,而只包含在 liba.so 中。为什么不将main.c链接到 liba.so ?
否则,在 libb.c 中声明void bar();
应该有帮助..