一、Windows下的动态库
前面学习了Linux下的库的开发应用过程,现在回过头看看Windows。如果用比较容易明白的话来区别二者的不同的话,应该是“Windows平台的库混杂了微软自己很多的东西,看似简单,但比Linux下的库要复杂很多”。写过跨平台开发的程序都知道,在Windows平台下,动态库也要带着.lib文件,否则在编译链接时就会报错。
其实微软的想法非常简单,正如平时处理工具,把工具分得清楚明白不更好寻找和使用么。想法是很好的,可工具量少啊,如果工具海量并且经常更新换代,细节的管控,反而成为了累赘。这是什么意思呢?就是说在库本身的文件中,包含了大量的和细节相关的数据,比如符号的地址,库的类型等。
实际上在Windows平台上进行库编译时,需要根据不同的二进制文件来进行区分。.dll文件是真正的库文件,也就是和LINUX下的SO一样,是动态链接时的共享对象。那么为什么还要有一个.lib文件呢?原因就在于,微软为了方便链接,一些细节的符号表就在这个文件中,而在LINUX的动态库使用过程中,已经说明了,查找共享资源映射内存,这些符号表是必不可少的,到这里就明白了吧。这也是为什么很多新手上来后,发现动态库和静态都有一个lib文件,但是前者的文件要小很多。微软的意思比较明确,有了这些符号表,就可以在编译期控制一些东西而不是像LINUX,有些符号最终会使用装载器来映射查找。
此外,微软还搞了一些导出符号的规定,而这些规定在X64平台又基本都失效了。比如__stdcall啥的,在X64平台上只有一个fastcall了。其它的小零碎如def文件啥的,看上去应