社区
C++ 语言
帖子详情
编译、链接疑惑
BBAPI
2011-07-23 02:36:26
自己理解编译器预处理程序在遇到#include<stdio.h>时会把stdio.h库文件包含进来然后编译器把包含库文件的源文件编译成目标文件,连接程序再把各个目标模块整合成一个载入模块。可今天看了一本书,有说到“连接器的输入为一组目标模块和库文件”,这我疑惑了,库文件不是在预处理时就包含进来了吗?
...全文
87
12
打赏
收藏
编译、链接疑惑
自己理解编译器预处理程序在遇到#include时会把stdio.h库文件包含进来然后编译器把包含库文件的源文件编译成目标文件,连接程序再把各个目标模块整合成一个载入模块。可今天看了一本书,有说到“连接器的输入为一组目标模块和库文件”,这我疑惑了,库文件不是在预处理时就包含进来了吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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只是标准库的头文件,不要把库和库文件混为一谈。
并行SuperLU工程资源myParSuperLUproj.zip
该资源是本人博客中与《使用MPI
编译
Linux平台下使用的并行SuperLU静态
链接
库》一文对应的工程资源,里面包含了工程源代码、头文件以及所有用到的
编译
好的库文件。所提供的是32位Linux i386/i686架构下的版本,使用请参考本人博客文章与相关文档资源!有
疑惑
请于博客讨论交流~
C++
编译
链接
全过程
今天博文主要讨论的问题是:我们编写的程序代码是怎样运行起来的?到底运行的是什么内容?平时我们所说的
编译
主要包括预
编译
、
编译
、汇编三部分,这三部分分别都干什么工作,主要职能有哪些,接下来我们一步步探讨总结。 (一)预
编译
(1)由源文件“.cpp/.c”生成“.i”文件,这是在预
编译
阶段完成的;gcc -E .cpp/.c --->.i (2)主要功能 展开所有的宏定义,消除“#de...
C++ :
编译
链接
运行原理
一、
编译
链接
运行原理 1.预
编译
(生成*.i文件) 1>将所有的“#define”删除,并且展开所有宏; 2>处理掉所有条件预
编译
指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“#endif”; 3>处理“#include”指令,这是一个递归过程; 4>删除所有的注释“//”和“/* */”; 5>添加行号和文件名标识; 6&g...
《程序员的自我修养-
链接
-装载与库》第二章
编译
与
链接
对于平常的应用程序开发,我们很少需要关注
编译
和
链接
过程,因为通常的开发环境都是 流行的集成开发环境(IDE),比如 Visual Studio、Delphi等。这样的IDE一般都将
编译
和链 接的过程一步完成,通常将这种
编译
和
链接
合并到一起的过程称为构建(Build)。即使使用命令 行来
编译
一个源代码文件,简单的一句“gcc hello.c”命令就包含了非常复杂的过程。 IDE和
编译
器提供的默认配置、
编译
和
链接
参数对于大部分的应用程序开发而言已经足够使 用了。但是在这样的开发过程中,...
C++: 2.
编译
链接
运行原理和虚拟内存空间
编译
链接
运行原理 1.预
编译
(生成.i文件) 1.将所有的“#define”删除,并且展开所有宏; 2.处理掉所有条件预
编译
指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“#endif”; 3.处理“#include”指令,这是一个递归过程; 4.删除所有的注释“//”和“/* */”; 5.添加行号和文件名标识; 6.保留所有的#pragma
编译
器指令,待
编译
器使用;...
C++ 语言
65,206
社区成员
250,517
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章