GCC
什么是GCC
GCC 是 GNU 编译器集合(GNU Compiler Collection)的缩写。它是一个开源的编程语言编译器,支持多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 和 Go 等。GCC 最初由理查德·斯托曼(Richard Stallman)创建,它是自由软件基金会(Free Software Foundation)的一部分,遵循 GNU 通用公共许可证(GNU General Public License)。
GCC编译流程
GCC 常用命令
选项 | 说明 |
---|---|
-E | 只预处理指定源文件,不编译 |
-S | 编译指定源文件,不汇编 |
-c | 编译汇编指定源文件,不链接 |
-o [file1] [file2] | 将文件 file2 编译成可执行文件 file1 |
-On | n 得反胃是 [ 1 , 3 ] [1,3] [1,3] ,数字越大优化级别越高,编译时间越长,默认是 O1 |
-I directory | 指定编译时头文件所在的目录 |
-l | 指定编译时使用的库 |
-L | 指定编译时使用库所在的路径 |
-g | 编译时生成调试信息,表示该程序可以被调试器调试 |
-D | 在编译时指定一个宏 |
-fpic | 生成与位置无关的代码 |
-shared | 生成共享目标文件,通常用在建立共享库的时候 |
-std | 指定语言标准 |
-W | 不生成任何警告 |
-Wall | 生成所有警告 |
示例程序:
# 分步编译
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o main# 一步到位
gcc main.c -o main#多文件编译
gcc test.c main.c -o main
静态库
1.什么是库
-
库文件是计算机上的一类文件,可以简单的把库文件看成是一种代码仓库,它提供给使用者一些直接可以拿来使用的变量、函数 和 类;
-
库是一种特殊的程序,库的编写和一般的程序没区别,只是库不能独立运行;
-
库文件有两种,静态库 和 动态库(共享库),区别是:
-
- 静态库在程序 链接阶段 被复制到了程序中;
-
- 动态库在 链接阶段 没有被复制到程序中,而是在程序运行时由系统动态的加载到内存中供程序调用;
2.库的优点
- 代码是保密的;
- 方便部署和分发;
3.静态库的制作
命名规则
Linux:libxxx.a
lib
:前缀(固定的);xxx
:库的名字(自己取名);.a
:后缀(固定的);
Windows:libxxx.lib
静态库制作
- 用
gcc
编译,不链接,获得.o
文件; - 将
.o
文件打包,使用ar
工具(archive)ar rcs libxxx.a xxx.o xxx.o ...
;
r
,将文件插入到备存文件当中去;c
,建立备存文件;s
,建立索引;
4.示例
在 Linux 中创建如下的一个 demo
的目录结构:
从上到下依次的代码为:
head.h
#include <stdio.h>int add(int a,int b);int sub(int a,int b);int mul(int a,int b);double div(int a,int b);
main.c
#include <stdio.h>#include "head.h"int main(){int a = 10 , b = 20;printf("a = %d , b = %d\n",a,b);printf("a + b = %d\n",add(a,b));printf("a - b = %d\n",sub(a,b));printf("a * b = %d\n",mul(a,b));printf("a / b = %.2lf\n",div(a,b));return 0;
}
add.c
#include "head.h"int add(int a,int b){return a + b;
}
sub.c
#include "head.h"int sub(int a,int b){return a - b;
}
mul.c
#include "head.h"int mul(int a,int b){return a * b;
}
div.c
#include "head.h"double div(int a,int b){return a * 1.0 / b;
}
1.首先制作静态库 libcal.a
- 来到
src
目录下,首先要获得.o
文件:
这里报错了,显示找不到 head.h
头文件。
因为 head.h
头文件是在 include
目录下,从当前所在目录程序是无法找到的,我们只需要指定头文件的所在路径即可。
- 将
.o
文件打包,生成库文件libcal.a
:
2.生成可执行程序 app
- 将
src
目录下生成的静态库移动到lib
目录下:
2. 生成可执行文件 app
-I ./include/
表示指定库文件的路径为 当前目录下的include
目录下;-L ./lib/
指定库文件所在的路径;-l cal
表示使用的是 名为cal
库文件;