| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 264 人关注过本帖
标题:请教编译器和链接器是通过什么来寻找源文件的
收藏  订阅  推荐  打印
gz81
Rank: 1
等级:新手上路
帖子:9
积分:178
注册:2008-5-1
请教编译器和链接器是通过什么来寻找源文件的

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

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

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

例如这个fn()的实现是放在windows.cpp中,我是不知道它是如何可找到这个windows.cpp的 ,应该不是通过文件名的,因为有时候头文件跟对应的源文件可以起不同的名字。
2008-7-8 15:55
Arcticanimal
Rank: 3Rank: 3
等级:中级会员
帖子:333
积分:3600
威望:7
注册:2007-3-17

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

生活是自己的,但是活着并不只为自己
2008-7-8 21:28
gz81
Rank: 1
等级:新手上路
帖子:9
积分:178
注册:2008-5-1

说得很详细,真的很感谢。
2008-7-9 03:15
共有 263 人关注过本帖
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.046038 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved