1.GCC

1.1 什么是GCC

  Gcc原名GNU C语言编译器,编程语言发展至今,GNU编译套件已经包括C、C++、Objective-C、Java、Ada和 Go语言前端等。GCC不仅支持C的许多"方言",也可以区别不同的C语言标准,可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个c标准。例如,当使用命令行参数`-std=c99`启动GCC时,编译器支持c99标准。Linux安装GCC命令:

sudo apt install gcc g++

  GCC版本查看命令

gcc/g++ -v/--version

1.2 GCC的工作流程

  

 

 

1.3 gcc和g++命令的区别

  gcc通常用来编译.c文件,而g++通常用来编译.cpp文件,不是因为gcc不能对.cpp文件进行编译,而是因为gcc不能在链接阶段和cpp的文件库进行链接,无法生产可执行程序,但如果采用以下命令

gcc -lstdc++

  则可以用gcc命令对cpp文件完成链接。

1.4 gcc编译的常用参数选项

 1 -E //进行预处理,但不编译
 2 -S //进行编译,但不汇编
 3 -c //进行编译、汇编、但是不进行链接
 4 -o [file1] [file2] / [file2] -o [file1] //将文件file2编译成可执行文件file1
 5 -I directory //指定头文件所在目录
 6 -g //生成调试信息,使代码可被gdb调试
 7 -D //编译时,指定一个宏
 8 -w //不生成任何警告信息
 9 -Wall //生成所有警告信息
10 -On //n是数值,0-3之间,指定编译器的优化级别,O0表示没有优化,O3最高优化
11 -L  //编译时,指定库文件路径
12 -l //编译时,指定库文件名称(不包含lib部分)
13 -fpic //生成与位置无关的代码,通常配合下面命令生成动态库
14 -shared // 生成共享目标文件,建立动态库时使用

2.库文件

 2.1 什么是库文件

库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。库文件有两种,静态库和动态库(共享库)﹐区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。库的好处: 1.代码保密2.方便部署和分发。

2.2 静态库

命名规则:

libxxx.a 
//lib:库前缀,固定
//xxx:库名,自拟
//.a:静态库后缀,固定

静态库的制作:

gcc [file2] -c [file1] // gcc -c生成没有链接的.o文件
ar rcs libxxx.a xxx.o xxx.o .... //ar工具进行.o文件静态库打包
//-r 将文件插入备存
//-c 建立备存文件
//-s 索引

 静态库的使用:

gcc [file2] -o [file1] -l xxxx -L ./xxx //-l为静态库名称, -L为静态库所在目录

2.3动态库

  命名规则:

libxxx.so //同静态库,后缀so固定

  制作:

1 gcc -c -fpic xxx.c xxx.c //通过fpic得到与位置无关的.o文件
2 gcc -shared xxx.o xxx.o -o libxxx.so //通过-shared得到动态库

  动态库使用:

//与静态库不同,动态库会被加载到内存中,可以通过ldd命令查看依赖关系
//定位动态库需要配置环境变量

//终端级别
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/.....
//终端添加环境变量,绝对路径添加动态库所在位置

//用户级别
vim ~./bashrc
//在最后一行插入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/.....

//系统级别
sudo vim /etc/profile
//在最后一行插入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/.....

  插入保存并通过.命令运行更新即可

2.4 动态库与静态库的区别

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

 

  静态库的优缺点:

   

 

 

  动态库的优缺点: