Linker ar引入了未定义的引用
我试图找出如何使用静态库,但最简单的例子失败了:Linker ar引入了未定义的引用,linker,unix-ar,Linker,Unix Ar,我试图找出如何使用静态库,但最简单的例子失败了: //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 但是链接失败,引
//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
工作得非常好。在尝试了很多愚蠢的东西之后,最愚蠢的想法是解决方案:ld
首先想要对象文件,然后是归档文件。耶
gcc libfoo.a main.o // fails
gcc main.o libfoo.a // works
如果使用-L.
和-lfoo
指定库,情况也是如此:放置-L
的位置显然并不重要,但放置-lfoo
的位置与直接指定.a
文件的程度相同