本文摘要
这篇文章主要介绍 gcc 相关的技术,包括以下 8 个方面:
1. gcc 简介
2. gcc 参数
3. gcc 编译 C 程序 4 个过程
4. 实验一:编译多个 C 程序
5. 实验二:打包静态库并调用
6. 实验三:打包动态库并调用
7. g++ 简介
8. 结语
我是一个比较强调实践的人,我写的技术文章也是,还希望看完有兴趣一定要实践,出错不可怕,害怕出错才可怕呢。
gcc 简介
GCC(GNU Compiler Collection)
GNU 编译器套件,它是 GNU 项目中符合 ANSI C
标准的编译系统,能够编译用 C,C++,Object - C 等语言编写的程序,同时 gcc 也是一个交叉编译器,特别适用于不同平台的嵌入式开发,例如可以在 x86 下编译 ARM 程序。
gcc 规定的部分文件名
gcc 官方规定了下面的一些文件名,有必要了解一下:
- c: C 源程序
- cc/cxx: C++ 源程序
- m: Objective-C 源程序
- i: 预处理的 C 源程序
- ii: 预处理的 C++ 源程序
- s/S: 汇编语言源程序
- h: 预处理头文件
- o: 目标文件
- a: 静态库文件
- so: 动态库文件
HelloWorld
下面以编译 hello.c
为例简单介绍 gcc 的基本使用方法:
// hello.c
#include <stdio.h>
int main(void) {
printf("Hello World\n");
return 0;
}
编译指令:
gcc hello.c -o hello
这句话的意思是编译 hello.c
文件,[ -o ]
指定了编译后的可执行文件名为 hello
,之后我们就可以直接执行 hello
。当然还有许多复杂的可选项可以使用,下面来做个参数的大体介绍,更复杂的参数用法还需要在实际工作中去总结。
gcc 参数
在使用 GCC 编译器的时候,我们必须给出一系列必要的调用参数和文件名称,如下:
gcc [options] [filenames]
其中 options
是编译器所需要的参数,filenames
是相关的文件名称。
gcc 参数分类
gcc 的参数有很多,我们不需要全部都学会,也没有那个精力,我们先大概看下基本的分类:
- 通用参数
- C 语言参数
- C++ 参数
- Object - C 参数
- 语言无关参数
- 警告参数
- 调试参数
- 优化参数
- 预编译参数
- 汇编参数
- 链接参数
- 机器依赖参数
可以看出类别还是很多的,但是我们平常使用的参数也不是很多,把经常用的学会基本就够用了,不懂的参数可以通过 man gcc
来查找,那下面就来介绍下常用的一些参数。
常用参数
哪些是常用的参数呢?告诉你一个方法,man gcc
手册中前面列出的基本就是常用的了,我总结了下面这些。
1. 编译过程参数
下面几个编译过程比较常见,例如 [-o],[-c],[-l]
等:
[-c]:编译不链接,生成 .o 文件
[-S]:编译不汇编,只生成汇编代码
[-E]:只预编译
[-g]:包含调试信息
[-o file]:指定输出文件名称
[-l dir]:添加头文件路径
2. 动态库和静态库参数
我们经常需要静态编译,打包动态库 .so
,这些参数也很有用:
[-static]:让 gcc 静态编译
[-Ldir]:添加搜索库文件的路径
[-shared]:生成动态库文件,用于打包动态库
[-fPIC]: