1 | gcc
|
2 | ===
|
3 |
|
4 | 基于C/C++的编译器
|
5 |
|
6 | ## 补充说明
|
7 |
|
8 | **gcc命令** 使用GNU推出的基于 `C/C++` 的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用 `GCC`,怎样才能更好的应用 `GCC`。目前,`GCC` 可以用来编译 `C/C++`、`FORTRAN`、`JAVA`、`OBJC`、`ADA`等语言的程序,可根据需要选择安装支持的语言。
|
9 |
|
10 | ### 语法
|
11 |
|
12 | ```shell
|
13 | gcc(选项)(参数)
|
14 | ```
|
15 |
|
16 | ### 选项
|
17 |
|
18 | ```shell
|
19 | -o:指定生成的输出文件;
|
20 | -E:仅执行编译预处理;
|
21 | -S:将C代码转换为汇编代码;
|
22 | -wall:显示警告信息;
|
23 | -c:仅执行编译操作,不进行连接操作。
|
24 | -l:用来指定程序要链接的库,-l参数紧接着就是库名
|
25 | -I:寻找头文件的目录
|
26 | ```
|
27 |
|
28 | ### 参数
|
29 |
|
30 | C源文件:指定C语言源代码文件。
|
31 |
|
32 | ### 实例
|
33 |
|
34 | **常用编译命令选项**
|
35 |
|
36 | 假设源程序文件名为test.c
|
37 |
|
38 | **无选项编译链接**
|
39 |
|
40 | ```shell
|
41 | gcc test.c
|
42 | ```
|
43 |
|
44 | 将 `test.c` 预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为 `a.out`。
|
45 |
|
46 | **选项 -o**
|
47 |
|
48 | ```shell
|
49 | gcc test.c -o test
|
50 | ```
|
51 |
|
52 | 将 `test.c` 预处理、汇编、编译并链接形成可执行文件 `test`。`-o` 选项用来指定输出文件的文件名。
|
53 |
|
54 | **选项 -E**
|
55 |
|
56 | ```shell
|
57 | gcc -E test.c -o test.i
|
58 | ```
|
59 |
|
60 | 将 `test.c` 预处理输出 `test.i` 文件。
|
61 |
|
62 | **选项 -S**
|
63 |
|
64 | ```shell
|
65 | gcc -S test.i
|
66 | ```
|
67 |
|
68 | 将预处理输出文件 `test.i` 汇编成 `test.s` 文件。
|
69 |
|
70 | **选项 -c**
|
71 |
|
72 | ```shell
|
73 | gcc -c test.s
|
74 | ```
|
75 |
|
76 | 将汇编输出文件 `test.s` 编译输出 `test.o` 文件。
|
77 |
|
78 | **无选项链接**
|
79 |
|
80 | ```shell
|
81 | gcc test.o -o test
|
82 | ```
|
83 |
|
84 | 将编译输出文件 `test.o` 链接成最终可执行文件 `test`。
|
85 |
|
86 | **选项 -O**
|
87 |
|
88 | ```shell
|
89 | gcc -O1 test.c -o test
|
90 | ```
|
91 |
|
92 | 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
|
93 |
|
94 | **多源文件的编译方法**
|
95 |
|
96 | 如果有多个源文件,基本上有两种编译方法:
|
97 |
|
98 | 假设有两个源文件为 `test.c` 和 `testfun.c`
|
99 |
|
100 | **多个文件一起编译**
|
101 |
|
102 | ```shell
|
103 | gcc testfun.c test.c -o test
|
104 | ```
|
105 |
|
106 | 将 `testfun.c` 和 `test.c` 分别编译后链接成 `test` 可执行文件。
|
107 |
|
108 | **分别编译各个源文件,之后对编译后输出的目标文件链接。**
|
109 |
|
110 | ```shell
|
111 | gcc -c testfun.c #将testfun.c编译成testfun.o
|
112 | gcc -c test.c #将test.c编译成test.o
|
113 | gcc testfun.o test.o -o test #将testfun.o和test.o链接成test
|
114 | ```
|
115 |
|
116 | 以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
|
117 |
|
118 | **加载动态链接库**
|
119 | ```shell
|
120 | gcc hello.c -lpthread -o hello
|
121 | ```
|
122 |
|
123 | **手动添加文件头路径**
|
124 | ```shell
|
125 | gcc hello.c -lpthread -I /lib64/ -o hello
|
126 | ```
|
127 |
|