很容易犯的错误,转载以备注!
转载请注明文章地址,尊重作者赖半仙的劳动成果,谢谢支持:
http://hi.baidu.com/mgqw/blog/item/0969c4230a2508559922edc3.html
这几天在弄一个东西,相同的文件编译的动态库和静态库,调用动态库没有问题,调用静态库确报错:函数没有定义就引用(undefined reference to ***)。让我无比的郁闷,两个库文件一模一样都是相同的.o文件编译出来的,就是静态库调用的时候报错,而动态库完全正常,无比让人抓狂。
埋头试了n久结果在一个不经意间发现了问题的所在,无比让人抓狂!!!!!
下面是一个简单的例子,有几个简单的程序文件:bill.c fred.c lib.h program.c(这个是主文件)
|
|
//lib.h void bill(char *); void fred(int); |
|
总共四个文件,用gcc命令编译bill.c fred.c两个文件成动态库
$ gcc -c bill.c fred.c
$ ar -crv libfoo. bill.o fred.o
然后编译program.c调用libfoo.a进行链接,看看俩个效果吧,先来正确的,注意program.c libfoo.a的位置:
$ gcc -o test
program.c libfoo.a
program.c: 在函数‘main’中:
program.c:6: 警告:隐式声明与内建函数‘exit’不兼容
下面是链接报错的,其他都一样,只是mian函数文件和静态库文件位置调换了一下,立马报错:
]$ gcc -o test
libfoo.a program.c
program.c: 在函数‘main’中:
program.c:6: 警告:隐式声明与内建函数‘exit’不兼容
/tmp/cc88fWhl.o: In function `main':
program.c:(.text+0x19): undefined reference to `bill'
collect2: ld 返回 1
这么一个小小的问题害我迷茫了两天,我靠,看来还是要养成好习惯:
永远把含有mian函数的主文件放在编译命令的第二位(第一是定义输入文件名)那就不会出错了。
或者是永远把库文件放在编译链接命令的最后。
本文转自 xkdcc 51CTO博客,原文链接:http://blog.51cto.com/brantc/441293,如需转载请自行联系原作者