【发布时间】:2015-07-24 09:14:02
【问题描述】:
我有以下文件:
文件 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 相关联,而 libb.so 又与 liba.so 和 liba.so 相关联> 确实有符号 bar。 main.c 使用符号 foo 并且它也驻留在 liba.so 中,并且在链接过程中可以找到。
所以 foo 和 bar 这两个符号都在 liba.so 中定义,但只找到 foo在链接期间。为什么?
似乎只有 liba.so 中的符号在 libb.so 中使用。但是为什么会这样呢?
【问题讨论】:
-
无需进一步分析,最后一行应为
gcc -L. -Wl,-rpath,. -lb main.c -
这更糟糕,因为它报告 abc、foo 和 bar 为未定义,因为 main.c 列在 -lb 之后。在 main.c 之后移动 -lb 会导致与上面的调用相同的错误消息。
标签: c gcc linker shared-libraries