C语言 之 编译自己的lib库

本文详细解释了编译和链接的区别,重点说明了链接过程如何查找和定位库函数,以及生成静态库和动态库的方法。文章还对比了Linux和Windows下的文件格式差异。

编译和链接是不同的,编译时不需要找到对应的库文件,链接时才需要。链接时它也不找,而是采取如下办法:
1. 把所有需要的库中的符号都载入内存(这里需要的库是工程里设置好的,而不是根据头文件变化而变化的)
2. 链接时如果需要一个函数,链接程序会到步骤1中的符号表中找,并进行定位。
所以无论在哪个库文件中,只要你在工程中指定它为需要的库,则链接程序都会载入它的符号到符号表。要找到需要的函数,不需要知道它在哪个库文件中,只要符号表有即可。

因此库是必须指定的,在link的时候链接上,或者说,你直接编译出.obj文件就足够了,实际上,只要你编译成功,就没必要编译成lib文件。唯一的好处是减少编译时间。。。或者不希望别人看到源代码,link是一样link的。

生成静态动态库一般是通过工程选择库项目实现的。在Windows下推荐用IDE构建项目来生成和引用,在Linux下则往往写makefile来生成。

生成动态库还有点用。

每日小常识:

Linux下中间文件是.o,而Windows是.obj

Linux下静态库是.a,Windows下是.lib

Linux下动态库是.so,Windows下是.dll

部分内容:  用C 语言编程时,通常要建立一些用户函数。如果这些函数具有通用性,一般的方法是将它们作成头文件,当需要时用“#include”命令将其包含到源程序之中,以提高编程效率。但在特定的程序中一般仅使用这些函数的一部分,若用上述方法包含所有函数,编译器在编译的时候会把所有包含进的函数都进行编译,这无疑会使源程序变得庞大而难于理解,并会影响执行效率。建立用户目标模块lib文件)可以解决这个问题,你可以事先把有特定功能的通用的子函数集编译完成后生成的obj文件打入lib文件,当链接器tlink.exe在进行链接操作时,便只会把程序内部用到的通用函数所在的obj文件链接进来(已验证:不能定位到具体函数),这样生成的obj文件便会更精简,生成的exe文件也更小。   其实,一个lib文件是obj文件的集合。当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件。我们可以通过tlib.exe(在tc2.0下的根目录)来对lib文件进行操作,你可以把自己生成的obj文件通过tlib命令加入到一个lib文件中,也可以把lib文件内的obj文件进行删除操作,还可以把内部的obj文件给提取出来。明白了lib文件的大致结构以及对它的具体操作,在学习C语言的过程中,就会又多了一个切入点对C语言具体实现进行研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值