| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1313 人关注过本帖
标题:请教编译器和链接器是通过什么来寻找源文件的
只看楼主 加入收藏
gz81
Rank: 5Rank: 5
等 级:职业侠客
帖 子:137
专家分:369
注 册:2008-5-1
结帖率:100%
收藏
 问题点数:0 回复次数:2 
请教编译器和链接器是通过什么来寻找源文件的
请教编译器和链接器是通过什么来寻找源文件的

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

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

例如这个fn()的实现是放在windows.cpp中,我是不知道它是如何可找到这个windows.cpp的 ,应该不是通过文件名的,因为有时候头文件跟对应的源文件可以起不同的名字。
搜索更多相关主题的帖子: 文件 编译 链接 
2008-07-08 15:55
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
IDE设有默认的链接库, VC的项目设置上可以看到, 这些默认的库文件就导入了大部分API. API的实现在一些动态链接库里, 运行的时候再链接。
lib文件告诉编译器哪个dll能够导出哪些函数,然后编译器会把这些信息写入可执行文件的一个称作导入表的位置。程序运行的时候由操作系统读取导入表并加载这些dll,然后得到导入函数的线性地址, 并写回导入地址表(对可执行文件在内存中的映像)。如果没有显式指定, OS会按照一定的路径规则去搜寻dll
所以,链接器并不知道具体的实现代码在什么位置,只知道可能存在某个动态链接库可能实现了这个函数。编译器假定这两个可能都是成立的,而且不做任何检查。即使实际上没有这个动态链接库或者这个动态链接库中根本就没有这个函数,链接还是可以成功。一切依赖于lib文件

try new catch
2008-07-08 21:28
gz81
Rank: 5Rank: 5
等 级:职业侠客
帖 子:137
专家分:369
注 册:2008-5-1
收藏
得分:0 
说得很详细,真的很感谢。
2008-07-09 03:15
快速回复:请教编译器和链接器是通过什么来寻找源文件的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017613 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved