在介绍本章的主题以前,咱们先来看几个问题:程序员
问题一微信
写C/C++的同窗应该常常遇到这样的一个Error:学习
"undefined reference to ABC"网站
在遇到这样的问题时你知道这背后到底哪里出问题了吗? 你一般都能顺利解决相似问题吗?spa
问题二.net
做为世界上最大的同性交友网站GitHub,里面有不少很棒的项目,通常咱们或者直接下载其发布版(release version),或者下载源码本身编译,无论是直接下载发布版仍是本身编译,最终都会获得一个(或几个)以.so或者.a为结尾的文件(Windows下为DLL文件或者lib文件),这时你知道该怎么把这些.so或者.a文件引入你本身的项目吗?固然若是你去搜索一下也能获得答案,可是你知道这些答案背后的原理吗?翻译
问题三开发
你的同窗、同事在工做学习中可能不时就会说起到静态连接库动态连接库静态连接动态连接,每次听到这些词汇的时候在你脑海里,A)对此有很清晰的认知;B)一头雾水不知道他们在说些什么,你属于A仍是B?get
若是你还不能很好的解决上面前两个问题且对于问题三属于B,那么接下来你就要好好看这篇文章啦,解决这几个问题的关键就是这篇文章要介绍的连接器(Linker),虽然现代的集成开发环境IDE好比Visual Studio已经对程序员屏蔽了大部分连接器的工做,但理解连接器将极大提升你对工程的驾驭能力,也许你如今还不是很清楚,读完这篇文章你就能明白啦。编译器
什么是连接器(Linker)
让咱们引用维基百科中对连接器的定义:
a linker or link editor is a computer utility program that takes one or more object files generated by a compiler and combines them into a single executable file, library file, or another 'object' file.
若是你看不太懂没有关系,我来翻译一下,连接器是一个将编译器产生的目标文件打包成可执行文件或者库文件或者目标文件的程序。这个翻译比较拗口,不太好理解,这句话的意思具体以下:
首先是连接器的本质,连接器本质上也是一个程序,本质上和咱们常常使用的普通程序没什么不一样。
其次是连接器的输入,咱们常常使用的程序好比播放器,其输入是一个MP4文件,而连接器的输入是编译器编译好的目标文件(object file,若是你不理解什么是目标文件,请参考以前的文章《不简单的hello world之C标准库》)。
最后是连接器的输出,连接器在将目标文件打包处理后,生成或者可执行文
件,或者库,或者目标文件。
从这个定义中可以看出,连接器的做用有点相似于咱们常常使用的压缩软WinRAR(Linux下是tar),压缩软件将一堆文件打包压缩成一个压缩文件,而连接器和压缩软件的区别在于连接器是将多个目标文件打包成一个文件而不进行压缩。那么连接器究竟是如何工做的呢,咱们接着往下看。
《完全理解连接器:二,符号决议》
本文分享自微信公众号 - 码农的荒岛求生(escape-it)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。