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.c 和
也不抱怨:main.c
。 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
工作得很好。
I'm trying to figure out how to use static libraries, but the most trivial example fails:
//foo.c
int func(int i) {
return i+1;
}
//main.c
int func(int i);
int main() {
return func(41);
}
Compiling foo.c
and main.c
works:
gcc -Wall -o foo.o -c foo.c
gcc -Wall -o main.o -c main.c
Archiving foo.o
does not complain either:
ar rcs libfoo.a foo.o
But Linking fails with an undefined reference to func
:
ld libfoo.a main.o
ld -L. -lfoo main.o
both give me:
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'
I get a similar error if I take the detour via gcc
to link:
gcc libfoo.a main.o
gcc -L. -lfoo main.o
give me:
main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'
collect2: ld returned 1 exit status
What am I doing wrong here? According to all manuals and search engines I read/used this is the way to use static libraries.
Edit: Mind that gcc foo.o main.o
works perfectly fine.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
经过多次尝试愚蠢的事情后,最愚蠢的想法是解决方案:
ld
首先想要目标文件,然后 档案。耶!如果您使用
-L.
和-lfoo
指定库,情况也是如此:放置-L
的位置显然并不重要,重要的是放在哪里您将-lfoo
的重要性与直接指定.a
文件的程度相同。After a lot of trying stupid stuff, the most stupid idea was the solution:
ld
wants the object files first, then the archives. Yay!The same goes if you specify the library with
-L.
and-lfoo
: Where you put-L
doesn't matter apparently, but where you put-lfoo
matters to the same extent as if you specify the.a
file directly.