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
文件的程度相同