码迷,mamicode.com
首页 > 其他好文 > 详细

gcc链接静态库时对待.a文件和.o文件的不同

时间:2015-02-11 12:42:44      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

  很多人都知道,gcc在链接静态库时是从前往后找符号。因此如果一份文件foo引用了静态库bar.a,那么在链接命令中,bar.a必须放在foo的后面,也就是像gcc ... foo ... bar.a这样;否则链接时会报找不到定义的错误(即undefined reference to ...)。

 

  .a文件其实没什么特别的地方,它不过是将多个.o文件打包成一份文件。如果我们在链接命令中,直接用.o文件替换.a文件,那也需要遵循gcc的这种链接顺序吗?可以用gcc .. bar.o ... foo这样的链接命令吗?可以做个简单的试验。

 

  假设我们有两份源代码文件。一份是foo.c,定义了一个foo函数。

void foo()
{
}

  另一份是main.c,里面引用了foo函数:

void foo();

int main()
{
    foo();
}

  我们将foo.c编译成foo.o,然后打包成foo.a:

$ gcc -c foo.c

$ ar rcs foo.a foo.o

  如果我们让main.c链接foo.a,并且将foo.a放在main.c的前面,那就会如期望的那样出现链接错误:

$ gcc -o test foo.a main.c
C:\Users\ADMINI~1\AppData\Local\Temp\ccan3qBI.o:main.c:(.text+0xc): undefined reference to `foo‘
collect2.exe: error: ld returned 1 exit status

  但如果将foo.a换成foo.o,链接就不会报错了:

$ gcc -o test foo.o main.c

  所以结论是:.o文件在链接中并不遵循.a文件那样的链接顺序,看来链接器找符号时,一定会搜索命令中的.o文件。

 

  StackOverflow里的这篇帖子也提到了类似的事:http://stackoverflow.com/questions/11231101/gcc-linking-object-file-and-library-what-is-the-difference

gcc链接静态库时对待.a文件和.o文件的不同

标签:

原文地址:http://blog.csdn.net/zzxiang1985/article/details/43731883

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!