菜鸟问题,高手帮忙解答!!!!

zjjysoft 2005-09-20 09:47:01
一个很简单的程序
#include<stdio.h>
main()
{
printf("hello world\n");
}
输出一个字符串。
以我的理解,头文件“stdio.h”只是申明了函数prinf
的原型,具体实现应该在一个库文件(*.obj)里,我有个疑问,c链接
程序在链接过程中是怎么找到函数“printf”所在的库文件,然后把它跟我上面
编写的程序链接起来,而成为一个可执行文件的。希望高手帮我解答,这个问题困扰了我
好长时间了。
...全文
118 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
megaboy 2005-09-20
  • 打赏
  • 举报
回复
各个编译器查找用户文件的方式是不一样的。我假设你使用的是tc。

你应该先把abc.obj文件使用tlib转换为abc.lib,然后把abc.lib跟你的源文件一起建立一个工程编译,就可以了。
zjjysoft 2005-09-20
  • 打赏
  • 举报
回复
没人知道吗?自己顶,郁闷!!!!!
zjjysoft 2005-09-20
  • 打赏
  • 举报
回复
谢谢上面各位帮我解答,但如果我自己写了个库--abc.obj,
里面有个方法test(),然后我在另一个程序中引用它,如果我把
abc.obj放在bin目录下,程序也会出错。所以我的意思是为什么
系统定义的库函数链接程序可以正确链接,而自己定义的库函数不行呢?????
junguo 2005-09-20
  • 打赏
  • 举报
回复
在你的编译器的目录下会有一个bin目录,库文件编译过的目标文件就在这个目录下。
编译器在链接的过程中,会到这些obj文件中找到你所引用的函数,并把它们引用到程序中去。
deping_chen 2005-09-20
  • 打赏
  • 举报
回复
连接程序(link.exe)连接的是.obj(s) + .lib(s) + .res文件,形成可执行文件。
具体到你这个问题,连接程序会在C运行库的lib文件找到printf函数的名称,在可执行文件的引入函数表增加条目,该条目记录引入的函数名及其所在模块名并留下函数地址的空间。加载程序会执行动态连接,在引入函数表填写该函数的虚拟地址。这样程序就可以顺利执行了。
yangyzqo 2005-09-20
  • 打赏
  • 举报
回复
*.obj好像是目标文件?!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧