Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接)

这篇具有很好参考价值的文章主要介绍了Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.gcc/g++

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

编译链接的四个步骤:

1:预处理

2:编译

3:汇编

4:链接

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

1.1gcc -o 

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

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

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

gcc Date.c -o date.aout

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

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

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

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

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

gcc Date.c -o date.aout -E

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

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

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

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

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

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

gcc Date.c -o date.s -S

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

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

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

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

gcc Date.c -o date.o -c

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

1.5gcc -o (链接)

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

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

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

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

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

2.动态库/静态库 

2.1.再谈链接

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

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

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

2.2动态库

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

2.3静态库

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

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

gcc -o mybin-static test.c -static

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

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

sudo yum install -y glibc-static libstdc++-static

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

Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接),linux,运维,服务器

由图可知,静态链接静态库生成的可执行程序比动态链接动态库生成的可执行程序要大得多文章来源地址https://www.toymoban.com/news/detail-752740.html

到了这里,关于Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(49)
  • linux下g++链接动态库和静态库

    头文件的作用: include的作用就是复制内容到当前文件 井号开头的就是预处理指令,由预处理器处理,预处理阶段不关心代码,只处理预处理指令。 头文件主要 一是为了解决代码都写在一个文件太大了,二是把变量,结构体,函数声明这些固定的放在一起 函数只要声明了,

    2024年02月09日
    浏览(49)
  • 【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月14日
    浏览(43)
  • 【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

    这篇文章我们继续学习Linux中的开发工具,今天要学的是: Linux下的编译器——gcc/g++ 我们先来简单了解一下它们的概念: gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。 gcc: gcc 是 GNU 编译器集合中的 C 语言编译器。

    2024年02月16日
    浏览(41)
  • Linux CentOS7虚拟机配置静态IP并允许上网的配置方法

    2023博客之星评选已开启--成为城市领跑者 当我们成功的将CentOS镜像安装到了我们的虚拟机上后,可是这个时候,虚拟机还没有配置IP信息,为了后面开发 方便,我们需要设置一个静态IP。 本地电脑,右键点击网络-选择\\\"更改适配器选项\\\" - 启用VMnet8。 打开Vmware虚拟机,本文以

    2024年02月07日
    浏览(74)
  • 【linux深入剖析】动态库的使用(续) | 动静态库的链接

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 回顾上节,我们在创建了动态库libmymath.so 我们使用指令 gcc main.c -L. -lmymath -L . (-L + 路径表示myc这个库在哪

    2024年04月15日
    浏览(38)
  • 【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

    在计算机科学领域中,Linux 系统一直以来都是备受推崇的操作系统之一。其中,文件系统、软硬链接、动态库和静态库是 Linux 系统中非常重要的概念,在实际应用中扮演着不可或缺的角色。 在上一篇文章中,我们了解了 Linux 系统中文件描述符、重定向以及基础 IO 操作的相关

    2024年02月04日
    浏览(52)
  • VMware虚拟机+Centos7 配置静态,动态IP

    ls 修改BOOTPROTO=static i编辑 esc关闭 :wq保存 如图: 添加以下内容:IP地址、子网掩码、网关、dns服务器 ping 虚拟机地址192.168.74:100

    2024年02月09日
    浏览(39)
  • 【Linux-编译器gcc/glibc升级】CentOS7.9使用NodeJS18时报错/lib64/libm.so.6: version `GLIBC_2.27‘ not found

    文章已收录至https://lichong.work,转载请注明原文链接。 ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝 最近做一个前端项目Jenkins的自动构建时,项目使用nodejs18,正好公司Jenkins节点有些不够用,就用了台资源空余比较多的服务器用于充当Jenkins节点,配置好

    2024年02月16日
    浏览(41)
  • CentOS7 将动态分配IP改为静态IP的两种方法

    本文整理了CentOS7的将动态分配IP改为静态IP的两种方法。第一种方法是修改网卡对应的配置文件,然后重启network。第二种则是借助nmcli命令进行修改。 注:本文内容基于虚拟机上运行的CentOS7环境,实体机安装的CentOS7在网卡名称方面可能会有出入。 使用虚拟机的话,网卡的名

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包