ar引入了未定义的引用

时间:2011-10-30 12:10:59

标签: linker ar

我正在试图弄清楚如何使用静态库,但最简单的例子失败了:

//foo.c
int func(int i) {
  return i+1;
}
//main.c
int func(int i);
int main() {
  return func(41);
}

正在编译foo.cmain.c

gcc -Wall -o foo.o -c foo.c
gcc -Wall -o main.o -c main.c

归档foo.o也不会抱怨:

ar rcs libfoo.a foo.o

但是链接失败时对func的未定义引用:

ld libfoo.a main.o
ld -L. -lfoo main.o

都给我:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'

如果我通过gcc绕道而行,我会收到类似的错误:

gcc libfoo.a main.o
gcc -L. -lfoo main.o

告诉我:

main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'
collect2: ld returned 1 exit status

我在这里做错了什么?根据我阅读/使用的所有手册和搜索引擎,这是使用静态库的方法。


编辑:请注意gcc foo.o main.o完全正常。

1 个答案:

答案 0 :(得分:1)

经过大量尝试愚蠢的事情,最愚蠢的想法是解决方案:ld首先想要对象文件,然后然后档案。耶!

gcc libfoo.a main.o  // fails
gcc main.o libfoo.a  // works

如果您使用-L.-lfoo指定库,情况也是如此:您放置-L的位置显然无关紧要,但您将-lfoo问题放在哪里与您直接指定.a文件的程度相同。