【发布时间】:2018-11-21 14:29:17
【问题描述】:
最近我发现 Linux 链接器不会由于静态库中的未定义符号而失败,但是如果我直接与目标文件链接,则会由于相同的未定义符号而失败。这是一个简单的例子:
源代码:
$ cat main.c
int main() { return 0; }
$ cat src.c
int outerUnusedFunc() {
return innerUndefinedFunc();
}
int innerUndefinedFunc();
从中创建 *.o 和 *.a,使用“nm”进行比较:
$ gcc -c -o main.o main.c
$ gcc -c -o src.o src.c
$ ar r src.a src.o
ar: creating src.a
$ nm src.o
U innerUndefinedFunc
0000000000000000 T outerUnusedFunc
$ nm src.a
src.o:
U innerUndefinedFunc
0000000000000000 T outerUnusedFunc
(这里我们清楚地看到 *.o 和 *.a 都包含等号列表)
现在……
$ ld -o exe main.o src.o
src.o: In function `outerUnusedFunc':
src.c:(.text+0xa): undefined reference to `innerUndefinedFunc'
$ echo $?
1
$ ld -o exe main.o src.a
$ echo $?
0
GCC 区别对待的原因是什么?
【问题讨论】:
标签: gcc linker static-libraries undefined-symbol