gz81 发表于 2008-7-8 15:55

请教编译器和链接器是通过什么来寻找源文件的

请教编译器和链接器是通过什么来寻找源文件的

例如windows.h中声明了这么一个函数叫void fn() ,然后我要使用这个函数,必须包含windows.h,好了,包含完了,那么链接时肯定要找到这个fn的实现代码才能最后生成.exe

我想问的是:
链接器是如何找到这个fn()函数的实现代码的?

例如这个fn()的实现是放在windows.cpp中,我是不知道它是如何可找到这个windows.cpp的 ,应该不是通过文件名的,因为有时候头文件跟对应的源文件可以起不同的名字。

Arcticanimal 发表于 2008-7-8 21:28

IDE设有默认的链接库, VC的项目设置上可以看到, 这些默认的库文件就导入了大部分API. API的实现在一些动态链接库里, 运行的时候再链接。
lib文件告诉编译器哪个dll能够导出哪些函数,然后编译器会把这些信息写入可执行文件的一个称作导入表的位置。程序运行的时候由操作系统读取导入表并加载这些dll,然后得到导入函数的线性地址, 并写回导入地址表(对可执行文件在内存中的映像)。如果没有显式指定, OS会按照一定的路径规则去搜寻dll
所以,链接器并不知道具体的实现代码在什么位置,只知道可能存在某个动态链接库可能实现了这个函数。编译器假定这两个可能都是成立的,而且不做任何检查。即使实际上没有这个动态链接库或者这个动态链接库中根本就没有这个函数,链接还是可以成功。一切依赖于lib文件

gz81 发表于 2008-7-9 03:15

说得很详细,真的很感谢。

页: [1]

编程论坛