目录

一、GCC

1.1什么是GCC

 1.2 编程语言发展

1.3GCC工作流程

 1.4 gcc与g++的区别

二、静态库 

2.1什么是库

2.2静态库的制作

2.3静态库的使用

三、动态库

3.1动态库的制作

3.2工作原理

3.3动态库与静态库的对比

一、GCC

1.1什么是GCC

GCC 原名为 GNU C语言编译器(GNU C Compiler),是一种编译器,可以用来编译C、C++、JAVE、GO等语言库。

GCC如何安装?

安装命令 sudo apt install gcc g++;

查看版本指令:gcc/g++ -v/--version 

shall中常用的指令集:

ls:查看;(查看当前目录下的文件名);

cd:打开;(一般后面加上一个文件,即打开文件夹);

mkdir:创建文件(一般后面加一个名称,生成对应名称的一个文件夹);

vim:进入文档写代码。但是相对来说不好操作,所以写代码我们一般选择利用CS code写;

编译: gcc test.c -o app

运行:./+可执行文件名

gcc test.c -----直接生成a.outa  -o的作用是生成指定的文件,如果不加.o则生成默认的名称a,以及默认的后缀.out

直接编译,不指定生成文件;

 1.2 编程语言发展

        最开始是机器语言,也就是都有二进制01组成,计算机可以直接识别,但是对于开发展十分不友好,于是就发展出汇编语言,开发者可以进行编程,经过汇编后生成机器语言,最后发展为高级语言(如:c、c++)经过编译可生成汇编,经过汇编可生成机器语言。

1.3GCC工作流程

源代码经过预处理生成.i文件,预处理:将头文件的内容复制、删除注释、进行宏替换;

.i文件经过编译器编译成.s汇编代码;

.s汇编代码经过会汇编生成目标代码.o文件;

目标代码与库代码、其他目标代码以及启动代码共同连接成可执行程序;

可执行程序可以一步生成也可以逐步生成;

相关指令与功能:

预处理gcc test.c -E -o test.i
编译gcc test.i -S -o test.s
汇编gcc test.s -C -o test.o
直接操作gcc text.c
删除文件rm+文件名

 1.4 gcc与g++的区别

gcc 和 g++都是GNU(组织)的一个编译器;

1、gcc 只能编译 c 代码,g++ 只能编译 c++ 代码(错误)。

后缀为 .c 的,gcc 把它当作是 C 程序,而 g++ 当作是 c++ 程序;

后缀为 .cpp 的,两者都会认为是 C++ 程序,C++ 的语法规则更加严谨一些;

编译阶段:g++会调用gcc,对于c++两者是等价的。gcc不能完成c++的库连接,所以通常g++来完成连接,gcc负责编译。

2、编译只能用 gcc,链接只能用 g++(混淆概念)

编译可以用 gcc/g++,而链接可以用 g++ 或者 gcc -lstdc++。

gcc 命令不能自动和C++程序使用的库联接,所以通常使用 g++ 来完成联接。 但在编译阶段,g++ 会自动调用 gcc,二者等价

举例:-D

源码中含有宏:

直接编译运行:

加-D后运行:

 -Wall 生成警告信息:

二、静态库 

2.1什么是库

        库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用 者一些可以直接拿来用的变量、函数或类;

        库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行;

        库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制 到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加 载到内存中供程序调用。

库的好处:1.代码保密 2.方便部署和分发

2.2静态库的制作

命名规则:

Linux:libxxx.a

其中:lib:前缀(固定);

xxx:库的名字,自己设置;

.a:后缀(固定);

静态库的制作:

1、通过gcc获得.o文件;

2、将.o文件进行打包,使用ar工具(archive)

ar rcs libxxx.a xxx.o xxx.o·····;

2.3静态库的使用

        通过 xftp 7将需要的文件复制到对应的文件夹;

        将对应的文件生成.o文件add.c\div.c\mult.c\sub.c对应生成.o文件;

        然后将所有文件合称为一个静态库,合成方法采用ar rcs libxxx.a xxx.o xxx.o·····;

        通过tree指令查看目录树。如果没有tree指令,记得安装对应的指令sudo apt installa tree;

   下面使用静态库:

  上面的main.c中的内容如下:

        需要用到我们制作的动态库的函数,动态库的使用,既依赖于库,也依赖于库中对应的头文件。 

如上图,没有添加对应的头文件使得无法生成linux下的可执行程序;

生成可执行程序并进行运行;  

三、动态库

3.1动态库的制作

命名规则:

        linux操作系统下:libxxx.so

        其中:xxx为库的名称;

                   lib是前缀,为固定值;

                  .so是后缀,为固定值;

制作:

        1、通过gcc得到.o文件(需得到与位置无关的文件)

        gcc -c -fpic a.c b.c····;

        2、gcc得到动态库

        gcc -share a.o b.o···-o libcalc.so;

注:1、区分库名称和库文件的名称:xxx为库名称;libxxx.so为库文件名称;

       2、动态库需要生成与位置无关的.o文件,后面后详细解释;

3.2工作原理

        静态库:GCC 进行链接时,会把静态库中代码打包到可执行程序中;

        动态库:GCC 进行链接时,动态库的代码不会被打包到可执行程序中;只会打包一些动态库的信息,例如:动态库的名称等;

        那动态库如何被使用呢?

1、系统加载可执行代码时候,能够知道其所依赖的库的名字;

2、需要知道绝对路径;

        那么动态库何时被使用呢?

        动态库不像静态库那样直接被复制到可执行程序中,而是当可执行程序使用到动态库的API函数时被加载到可执行函数中去。

        如何定位动态库文件呢?

        对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib目录找到库文件后将其载入内存。

其中主要为:

环境变量LD_LIBRARY_PATH

env:输出环境变量;

先到path路径下找,让动态载入器去查找:配置

配置环境变量的方法:1、用户配置(临时)2、系统级别(永久)

1、用户级别配置

在中断直接进行配置,但是只是临时配置,不能永久使用;

2、系统级别配置

2.1.bashrc文件配置

在home下面的.bashrc文件中进行配置:

添加地址:

生效:.  .bashrc或source .bashrc

2.2在文件etc/profile中添加路径

/etc/ld.so.cache文件列表

sudo vim /et/ld.so.conf

把文件路径添加即可;

不建议/lib/,/usr/lib/中进行文件路径的添加;

3.3动态库与静态库的对比

        程序编译成可执行程序的过程:

静态库的制作过程:

动态库的制作过程:

静态库的优缺点

优点:静态库被打包到应用程序中加载速度快、发布程序无需提供静态库,移植方便;

缺点:消耗系统资源,浪费内存;更新、部署、发布麻烦;

动态库的优缺点

优点:可以实现进程间资源共享(共享库)、更新、部署、发布简单、可以控制何时加载动态库;

缺点:加载速度比静态库慢、发布程序时需要提供依赖的动态库;

总结:本节为linux应用的入门内容主要包括:gcc的使用、静态库的制作与使用、动态库的制作与使用;大家学习完后一定要进行熟练的练习!!

创作不易,还望大家多多支持!!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐