我正在试图弄清楚如何使用静态库,但最简单的例子失败了:
//foo.c
int func(int i) {
return i+1;
}
//main.c
int func(int i);
int main() {
return func(41);
}
正在编译foo.c
和main.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
完全正常。
答案 0 :(得分:1)
经过大量尝试愚蠢的事情,最愚蠢的想法是解决方案:ld
首先想要对象文件,然后然后档案。耶!
gcc libfoo.a main.o // fails
gcc main.o libfoo.a // works
如果您使用-L.
和-lfoo
指定库,情况也是如此:您放置-L
的位置显然无关紧要,但您将-lfoo
问题放在哪里与您直接指定.a
文件的程度相同。