本文介绍: 在我们上面写的c语言代码中,我们没有printf函数的具体实现,而在这个文件中也只有printf函数声明没有其具体实现定义,那么我们使用printf这个函数时候怎么去调用这个函数呢?在Linux Centos7 环境下,系统把这些函数的具体实现都放在了一个名为libc.so.6的。

1.gcc/g++

gcc是对c语言代码进行编译链接,而g++是对c++代码进行编译链接接下来我们只对gcc进行讲解g++的使用方法gcc是一样的。

编译链接的四个步骤:

1:预处理

2:编译

3:汇编

4:链接

注:这些在后面都会着重讲解

1.1gcc –o 

我们先在Date.c 源文件里面写一些c语言代码我们知道c语言代码需要编译链接翻译计算机识别二进制指令才能执行。而gcc就是Linux环境下用来对c语言代码编译链接指令.

gcc 源文件o 生成指定文件名

gcc Date.c –o date.aout

注:这里一步到位,直接会生成一个可执行程序接下来我们一步一步分析具体细节

1.2gcc -E (预处理)(.i)

预处理头文件展开、去注释、宏替换条件编译

-E:当程序进行翻译时,预处理阶段执行完就停下来

gcc Date.c –o date.aout -E

头文件展开:#include<stdio.h>这个文件里面有很多函数声明typedef内容,头文展开会将stdio.h这个文件中所有的内容复制一份到我们date.i文件中。

注释:会将我们注释内容替换为空格。

1.3gcc -S (编译)(.s)

编译:将c语言写的内容翻译汇编语言

-S:当程序进行翻译时,编译阶段执行完就停下来

gcc Date.c -o date.s -S

1.4gcc -c (汇编)(.o)

汇编:将汇编语言翻译二进制语言

-c:当程序进行翻译时,编译阶段执行完就停下来

gcc Date.c -o date.o -c

1.5gcc -o (链接)

当我们不带-E、-S、-c这些选项时,直接-o,gcc就会一步到位从预处理阶段到编译,再到汇编最后链接!!!

在我们上面写的c语言代码中,我们并没有printf函数的具体实现,而在<stdio.h&gt;这个文件中也只有printf函数的声明没有其具体实现定义,那么我们再使用printf这个函数的时候怎么去调用这个函数呢?

在Linux Centos7 环境下,系统把这些函数的具体实现都放在了一个名为libc.so.6库文件中了,路径为/usr/lib/libc.so.6,当我们调用printf函数时,会去libc.so.6库文件中去寻找printf实现实现方法,最终成功调用。

我们可以使用ldd可执行程序查看可执行程序依赖了那些库文件

2.动态库/静态库 

2.1.再谈链接

链接时候,我们是怎么去库文件中寻找函数具体实现方法的呢?

有两种情况,一种是我们得到函数的地址,在生成可执行程序时根据地址去调用这个函数,另一种则是我们得到这个函数的整体实现过程,在生成可执行程序时将函数实现的代码加载进来。

根据链接方式不同,库文件也就分成了两种:动态库/静态库,动态库使用动态链接,静态使用静态链接。

2.2动态库

动态库在程序执行时由运行时链接文件加载库,通俗来说就是调用这个函数的地址可执行程序中并不包含此函数的具体实现方法,减小了可执行程序大小
注:gcc在编译时默认使用动态库!!!
优点:比较节省资源磁盘内存网络等资源),不会出现太多重复代码
缺点:太过于依赖库,一旦库缺失,所有使用该库的程序都不能运行!!!

2.3静态库

静态库是指编译链接时
,
把库文件的代码全部加入可执行文件中,因此生成可执行程序占用空间比较大,但是运行时也就不依赖库了。
优点:不依赖库,同类型平台可以直接运行使用
缺点:可执行程序占用空间比较大,比较浪费资源(磁盘内存、网络等资源)

gcc编译时使用static选项可以在链接时使用静态链接的方式链接静态可。

gcc -o mybinstatic test.c –static

但是我们直接执行的话会出现问题这里原因是因为我们的系统中没用静态库,导致静态链接失败。我们可以使用yum命令下载c/c++的静态库,在root用户执行,或者使用sudo命令。如果不清楚yum命令的可以看我这一篇博客http://t.csdnimg.cn/M1JLr

sudo yum instally glibcstatic libstdc++-static

安装好静态库之后 我们再进行一次编译gcc -o mybinstatic test.c –static

由图可知,静态链接静态库生成的可执行程序比动态链接动态库生成的可执行程序要大得多

原文地址:https://blog.csdn.net/qq_73955920/article/details/134479868

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31352.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注