关于vc的链接问题

来源:百度知道 编辑:UC知道 时间:2024/05/16 03:19:48
1.当我们在代码中写如下宏
#include<stdio.h> //.h文件放了许多库函数的声明,printf是其中一个
然后就可以调用 printf 函数
然后编译
再链接,疑问来了,关于lib文件夹,include文件夹位置在IDE中可以设置,这点我知道。但是链接器link怎么知道printf函数的定义部分即静态库lib文件是lib文件夹下众多lib文件中的哪个?也就是如何联系起来的?
2.如果链接了相应的lib文件,岂不是有很多垃圾(除了printf以外还有许多用不到的其他的函数定义),这就是使用dll的原因之一吗?
3.自己如何实现库函数一样的功能,给一个头文件和一个库文件让别人使用?
4.库文件只是lib文件吗,lib文件夹下既有.lib,也有.obj
5.如何区分静态库和导入库

1. 每一个lib文件里面都有一张符号表。结构可能是这样的:
/*编号********函数的标记符****函数的代码在lib中的位置**代码长度**/
1*************printf**********0x242***************0x36

连接器一张张表都检查,直到查到相应的符号,然后提出需要的信息。

2.链接了相应的lib文件,只会连接需要的信息,不会全部函数都加载进exe文件里面。

使用Dll是为了减少exe的大小,因为对于一个大型软件,exe中很多代码是不常用的,把它做成dll,在需要的时候才加载是提高性能的好办法。同时升级软件也方便,只要升级一个dll就行,不用整个软件都升级。

3.定义几个.h文件和.c文件,生成的项目类型选库类型。这个具体与编译器有关,不同编译器的选项不同。

4.一个库就只是lib文件和.h文件,同时可能有让开发者调试用的调试符号文件(vc中是.pdb)。.obj是中间过程中生成,可以不管它,没什么用;他是编译器生成的,部分文件的编译结果,一般是用来给连接器用,让他连接成一个整体的输出,即.exe,dll, lib之类。

5.静态库是连接的时候把数据写进了exe,运行时就需要库了。

动态库是没有写进.exe,在exe运行的时候才查找库文件,把数据动态加进进程的数据空间里。因此他运行时需要提供一个库文件。

导入库用于描述LIB.
大多数情况下,不需要使用 LIB 创建导入库。在链接包含导出的程序(可执行文件或 DLL)时,LINK 自动创建描述导出的导入库。以后,在链接引用那些导出的程序时指定导入库。

但是,如果 DLL 导出到的程序同时也是它从中导入的程序,则无论是直接还是间接导入,都必须使用 LIB 创建其中某个导入库。LIB 在创建导入库时还创建导出文件。在链接其中某个 DLL 时必须使用导出文件。