linux中的gcc编译工具

一、用gcc生成静态库和动态库

  1. 先在Linux中创建一个文件
    在这里插入图片描述
    创建一个test1文件夹
    在这里插入图片描述
    进入test1文件
    接下来用vim编写三个程序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 将.c文件编译成.o文件
    在这里插入图片描述
    此时我们已经得到hello.o文件

1、由.o文件创建静态库文件

静态库文件名的命名规范是以 lib 为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将 创建的静态库名为 myhello,则静态库文件名就是 libmyhello.a。在创建和使用静态库时, 需要注意这点。创建静态库用 ar 命令。在系统提示符下键入以下命令将创建静态库文件 libmyhello.a,命令如下:

在这里插入图片描述
可以看到静态库文件已经成功创建

2、然后在程序中使用静态库

静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包 含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从 静态库中将公用函数连接到目标文件中。注意,gcc 会在静态库名前加上前缀 lib,然后追 加扩展名.a 得到的静态库文件名来查找静态库文件。 在程序 3:main.c 中,我们包含了静态库的头文件 hello.h,然后在主程序 main 中直接调用 公用函数 hello。下面先生成目标程序 hello,然后运行 hello 程序看看结果如何。
输入如下代码:
gcc main.c libmyhello.a -o hello

在这里插入图片描述

3、创建动态库文件

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyh ello.so。用 gcc 来创建动态库。 在系统提示符下键入以下命令得到动态库文件libmyhello.so。命令如下:
在这里插入图片描述
由此可以看到动态库已经成功建立

4、在程序中使用动态库

在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含 这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。我 们先运行 gcc 命令生成目标文件,再运行它看看结果。命令如下:

在这里插入图片描述
然后我们输入./hallo命令运行hallo,却出现了如下状况

在这里插入图片描述

原因是因为找不到动态库文件 libmyhello.so。程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提 示类似上述错误而终止程序运行。我们将文件 libmyhello.so 复制到目录/usr/lib 中,再试试。
在这里插入图片描述
这里显示MV命令不能移动,,查询以后发现是权限不足,可以加一个sudo
在这里插入图片描述
可以看到可以成功输出hello
从上述可知,如何找到生成的动态库有 3 种方式:
(1)把库拷贝到/usr/lib 和/lib 目录下。
(2)在 LD_LIBRARY_PATH 环境变量中加上库所在路径。 例如动态库 libhello.so 在/home/example/lib 目录下: e x p o r t L D L I B R A R Y P A T H = export LD_LIBRARY_PATH= exportLDLIBRARYPATH=LD_LIBRARY_PATH:/home/example/lib (3) 修改/etc/ld.so.conf 文件,把库所在的路径加到文件末尾,并执行 ldconfig 刷新。这样, 加入的目录下的所有库文件都可见。 附:像下面这样指定路径去连接系统的静态库,会报错说要连接的库找不到: g++ -o main main.cpp -L/usr/lib libpthread.a

二、Linux条件小.a与.so库文件的生成与使用

1、先创建一个文件保存练习
在这里插入图片描述
然后用vim编辑如下四个文件A1.c、A2.c、A.h、test.c:
A.h

在这里插入图片描述
A1.c
在这里插入图片描述
A2.c
在这里插入图片描述
test.c
在这里插入图片描述
静态库.a 文件的生成与使用。
生成目标文件,输入代码 gcc -c A1.c A2.c

在这里插入图片描述
生成静态库.a 文件 输入命令ar crv libafile.a A1.o A2.o

在这里插入图片描述
在这里插入图片描述
使用.a 库文件,创建可执行程序。采用此种方式,需保证生成的.a 文件与.c 文件保 存在同一目录下,即都在当前目录下

在这里插入图片描述

共享库.so 文件的生成与使用
(1)生成目标文件(xxx.o)(此处生成.o 文件必须添加"-fpic"(小模式,代码少),否则在生成.so 文件时会出错)
在这里插入图片描述
(2)生成共享库.so 文件。输入代码
gcc -shared *.o -o libsofile.so
在这里插入图片描述
(3)使用.so 库文件,创建可执行程序

在这里插入图片描述
可以看出发现错误,这是由于 linux 自身系统设定的相应的设置的原因,即其只在/lib and /usr/lib 下搜索对应 的.so 文件,故需将对应 so 文件拷贝到对应路径
在这里插入图片描述
再次执行./test,即可成功运行

三、Linux GCC 常用命令

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语 言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另 一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

在这里插入图片描述
这个程序,一步到位的编译指令是:gcc test.c -o test
实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译 (Compilation)、汇编 (Assembly)和连接(Linking
2、预处理
在这里插入图片描述
3、编译为汇编代码

在这里插入图片描述
4、汇编
在这里插入图片描述
5、连接

在这里插入图片描述

四、gcc的动态库与静态库使用的实例

用vim编辑器编写如下
在这里插入图片描述
编写3个.c文件
在这里插入图片描述
在这里插入图片描述
将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件
在这里插入图片描述
.将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件
在这里插入图片描述

五、gcc背后的故事

由于 GCC 工具链主要是在 Linux 环境中进行使用,因此本文也将以 Linux 系统作 为工作环 境。为了能够 演示编译的整个 过程,先创建一 个工作目录 test0,然后 用文本编辑器生成一个 C 语言编写的简单 Hello.c 程序为示例,其源代码如下所 示
在这里插入图片描述
编译过程
1、预处理的过程主要包括以下过程:
(1) 将所有的#define 删除,并且展开所有的宏定义,并且处理所有的条件预编 译指令,比如#if #ifdef #elif #else #endif 等。
(2) 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
(3) 删除所有注释“//”和“/* */”。
(4) 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
(5) 保留所有的#pragma 编译器指令,后续编译过程需要使用它们。
使用 gcc 进行预处理的命令如下: $ gcc -E hello.c -o hello.i
在这里插入图片描述
2、编译
gcc -S hello.i -o hello.s
将预处理生成的 hello.i 文件编译生成汇编程序 hello.s // GCC 的选项-S 使 GCC 在执行完编译后停止,生成汇编程序
在这里插入图片描述
3、汇编
汇编过程调用对汇编代码进行处理,生成处理器能识别的指令,保存在后缀为.o 的目标文件中。由于每一个汇编语句几乎都对应一条处理器指令,因此,汇编相 对于编译过程比较简单,通过调用 Binutils 中的汇编器 as 根据汇编指令和处理 器指令的对照表一一翻译即可。 当程序由多个源代码文件构成时,每个文件都要先完成汇编工作,生成.o 目标 文件后,才能进入下一步的链接工作。注意:目标文件已经是最终程序的某一部 分了,但是在链接之前还不能执行
gcc -c hello.s -o hello.o
在这里插入图片描述
4、连接
链接也分为静态链接和动态链接,

使用 size 查看大小在这里插入图片描述
分析 ELF 文件
ELF 文件格式,位于 ELF Header 和 Section Header Table 之间的都 是段(Section)。一个典型的 ELF 文件包含下面几个段:
.text:已编译程序的指令代码段。 .
rodata:ro 代表 read only,即只读数据(譬如常数 const)。 .
data:已初始化的 C 程序全局变量和静态局部变量。
.bss:未初始化的 C 程序全局变量和静态局部变量。 .
debug:调试符号表,调试器用此段的信息帮助调试。
在这里插入图片描述
反汇编
由于 ELF 文件无法被当做普通文本文件打开,如果希望直接查看一个 ELF 文件包 含的指令和数据,需要使用反汇编的方法。
在这里插入图片描述

六、Linux 系统中终端程序最常用的光标库(curses)的主要函数功能

屏幕中读取
在这里插入图片描述
清除屏幕
在这里插入图片描述
窗口移动和更新屏幕

在这里插入图片描述

七、curses的头文件的安装目录

使用命令sudo apt-get install libncurses5-dev 进行安装
用whereis 命令查看curses.h安装在哪里:
在这里插入图片描述

八、游客身份体验一下即将绝迹的远古时代的 BBS

在这里插入图片描述
在这里插入图片描述

九、Linux 环境下C语言编译实现贪吃蛇游戏

将网站上面的代码复制到linux的文件中,并在终端输入
gcc mysnake1.0.c -lcurses -o mysnake1.0,游戏完成
在这里插入图片描述

十、总结

本次实验内容较多,但是学到的东西也是很多。gcc生成静态库和动态库、静态库.a与.so库文件的生成与使用、并且对各种命令的使用更加地熟练,对软件的使用更加地熟悉。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值