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 动态库与静态库的区别
程序编译成可执行程序的过程:
静态库的优缺点:
动态库的优缺点: