Linux应用(一)——GCC、静态库、动态库
gcc的使用、静态库的制作与使用、动态库的制作与使用。
目录
一、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的使用、静态库的制作与使用、动态库的制作与使用;大家学习完后一定要进行熟练的练习!!
创作不易,还望大家多多支持!!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)