编译、链接疑惑

BBAPI 2011-07-23 02:36:26
自己理解编译器预处理程序在遇到#include<stdio.h>时会把stdio.h库文件包含进来然后编译器把包含库文件的源文件编译成目标文件,连接程序再把各个目标模块整合成一个载入模块。可今天看了一本书,有说到“连接器的输入为一组目标模块和库文件”,这我疑惑了,库文件不是在预处理时就包含进来了吗?
...全文
87 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
BBAPI 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pamtry 的回复:]

所谓的头文件,通常只包含了必要的声明,而实际定义部分则在对应的目标文件中

那么,所谓的链接,就是把声明的符号和对应的二进制目标文件进行组装的过程

举个实际的例子,假设自己编写一个对外公开的库。为了使代码模块化方便管理,可能会分布在不同的.c文件中,比如说:string.h/string.c net.h/net.c hello.h/hello.c等等。
在编译阶段,这些文件会被编译成……
[/Quote]多谢
pamtry 2011-07-23
  • 打赏
  • 举报
回复
所谓的头文件,通常只包含了必要的声明,而实际定义部分则在对应的目标文件中

那么,所谓的链接,就是把声明的符号和对应的二进制目标文件进行组装的过程

举个实际的例子,假设自己编写一个对外公开的库。为了使代码模块化方便管理,可能会分布在不同的.c文件中,比如说:string.h/string.c net.h/net.c hello.h/hello.c等等。
在编译阶段,这些文件会被编译成目标文件string.o net.o hello.o(如果是win下,则是.obj)。当然,这个时候我们可以把头文件以及对应的目标文件提供给其它用户使用。比如:那么当用户在文件中 #include <string.h>的时候,就引入了这个头文件中的函数声明、变量声明,在链接阶段,这些声明符号会结合string.o最终输出到可执行文件中。

那么什么是所谓的库文件呢?还是以上这个例子,假如我们希望同时对外提供以上3个目标文件,虽然也可以把他们放在一个文件夹下发布,但是毕竟这样还是比较麻烦的。那么我们可以把所有的目标文件打包成一个库文件,并对外提供一个头文件 mylib.h 其中包含 #include <string.h> #include <net.h> #include <hello.h>。这样,用户只需要引用mylib.h以及你打包好的库文件,就可以使用你提供的功能了
BBAPI 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hongwenjun 的回复:]

引用 8 楼 bbapi 的回复:

引用 5 楼 hongwenjun 的回复:

标准库的 函数 是 编译器厂家 已经编译号的 二进制 文件发行的.
#include<stdio.h> 提供头文件 ,是 自己编译的程序 到这个头文件里 取得一个函数名字
然后就可以调用了
#include<stdio.h>不是把stdio.h库头文件包含进来的意思?


头文件 是不直接……
[/Quote]有些理解了,多谢
hongwenjun 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bbapi 的回复:]

引用 5 楼 hongwenjun 的回复:

标准库的 函数 是 编译器厂家 已经编译号的 二进制 文件发行的.
#include<stdio.h> 提供头文件 ,是 自己编译的程序 到这个头文件里 取得一个函数名字
然后就可以调用了
#include<stdio.h>不是把stdio.h库头文件包含进来的意思?
[/Quote]

头文件 是不直接编译的,只有 CPP 文件把 头文件链接进来才编译。
函数都是全局的,所以 其他 CPP文件里定义的函数,main.cpp里不用再次编译的

只要把 二进制 文件 链接进来就可以了, 所以 编译器厂商 标准库的函数都是 二进制发行的
BBAPI 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hongwenjun 的回复:]

标准库的 函数 是 编译器厂家 已经编译号的 二进制 文件发行的.
#include<stdio.h> 提供头文件 ,是 自己编译的程序 到这个头文件里 取得一个函数名字
然后就可以调用了
[/Quote]#include<stdio.h>不是把stdio.h库头文件包含进来的意思?
Defonds 2011-07-23
  • 打赏
  • 举报
回复
包含进来
至善者善之敌 2011-07-23
  • 打赏
  • 举报
回复
你编写源代码通过编译器生产目标代码.OBJ

然后连接器把你编写的生产的目标代码OBJ和从标准库或其它库生产的OBJ再通过连接器生产EXE程序
hongwenjun 2011-07-23
  • 打赏
  • 举报
回复
标准库的 函数 是 编译器厂家 已经编译号的 二进制 文件发行的.
#include<stdio.h> 提供头文件 ,是 自己编译的程序 到这个头文件里 取得一个函数名字
然后就可以调用了
BBAPI 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pamtry 的回复:]

库文件,例如windows下lib或者linux下的so文件,可以简单的理解成一个obj或者o文件的集合

所以,“连接器的输入为一组目标模块和库文件”其实也就是各种目标模块,只不过库文件是模块的整合,比较特殊的模块罢了
[/Quote]我的理解是在编译时把包含进来的库头文件一起编译成目标模块,所以在链接时就不需要在链接比较特殊的模块-库文件了
BBAPI 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sonicling 的回复:]

一个库包含头文件和库文件,头文件输入给编译器,库文件输入给连接器。stdio.h只是标准库的头文件,不要把库和库文件混为一谈。
[/Quote]既然在编译时已包含了需要的库头文件,那链接时还需要输入库文件?
pamtry 2011-07-23
  • 打赏
  • 举报
回复
库文件,例如windows下lib或者linux下的so文件,可以简单的理解成一个obj或者o文件的集合

所以,“连接器的输入为一组目标模块和库文件”其实也就是各种目标模块,只不过库文件是模块的整合,比较特殊的模块罢了
SonicLing 2011-07-23
  • 打赏
  • 举报
回复
一个库包含头文件和库文件,头文件输入给编译器,库文件输入给连接器。stdio.h只是标准库的头文件,不要把库和库文件混为一谈。

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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