Linux c 开发 - gcc
来源:互联网 发布:支持java的游戏引擎 编辑:程序博客网 时间:2024/06/13 02:57
gcc是linux下的一种编译器。c语言通常都是通过gcc进行编译而成。
一般gcc的编译过程如下图:
我们从最简单的例子开始讲解gcc的一些使用方法。后面我们会具体讲解每一个编译步骤如何来编译的。
常用文件:
.o 文件:linux下的c语言目标文件
.a文件:linux下的静态连接库,相当于多个.o合起来。静态链接库在编译的时候加载生成目标文件,而在运行的时候不用加载库,对库没有依赖性。
.so文件:linux动态链接库。在目标文件运行时加载,手动加载,且对库有依赖性。
1. gcc直接编译
看一个最简单的hello world的例子:
#include <stdio.h>#include <stdlib.h>#include <stdio.h>int main() { printf("Hello World\n"); return 0;}我们执行命令:
gcc main.c
[admin@localhost c]$ gcc main.c[admin@localhost c]$ lsa.out main.c[admin@localhost c]$
可以看到多了一个a.out的文件,a.out是一个可执行的文件,我们可以执行一下可以看到输出了"hello world":
[admin@localhost c]$ ./a.out Hello World
每次生成a.out文件会有些不好玩,我们可以通过下面的命令可以将a.out重命名为我们自己想要的文件名称:
gcc main.c -o main //通过-o命令可以重命名
[admin@localhost c]$ gcc main.c -o main[admin@localhost c]$ lsmain main.c[admin@localhost c]$
这个时候再执行./main这个文件:
[admin@localhost c]$ ./main Hello World[admin@localhost c]$
2. gcc预处理
gcc编译过程可以看到最上面的图中有四个步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
我们需要对我们上面那段main.c进行预处理:
gcc -E main.c -o main.i
这个时候你就能看到文件目录下面多了一个test.i的文件,test.i的文件中可以看到编译器预处理的结果,是将include的内容合并到了test.i文件中。
[admin@localhost c]$ gcc -E main.c -o main.i[admin@localhost c]$ lsmain.c mian.i
3. gcc编译为汇编代码
预处理之后,会生成main.i文件,我们对这个文件进行编译成汇编代码
gcc -S main.i -o main.s //-S是进程编译成汇编代码
这个时候多了一个main.s的文件,就是进行编译成汇编的文件
[admin@localhost c]$ gcc -S main.i -o main.s[admin@localhost c]$ lsmain.c main.i main.s
4. gcc汇编
生成main.s的汇编代码之后,我们需要将汇编代码进行汇编的处理。生成main.o的文件
gcc -c main.s -o main.o //-c是进行汇编
[admin@localhost c]$ gcc -c main.s -o main.o[admin@localhost c]$ lsmain.c main.i main.o main.s
4. gcc连接
最近将生成的main.o文件连接起来生成最终的可执行文件。gcc main.o -o main //生成main可执行文件
[admin@localhost c]$ gcc main.o -o main[admin@localhost c]$ lsmain main.c main.i main.o main.s
4. gcc多个文件的编译
我们新增了一个test.h和test.c的文件,并且在main.c中调用了test.c中的方法,这个时候我们需要进行多个文件的编译。
test.h
#include <stdio.h>#include <stdlib.h>void test();
test.c
#include "test.h"void test() { printf("Hello World\n");}
main.c
#include <stdio.h>#include <stdlib.h>#include "test.h"int main() { test(); printf("Hello World\n"); return 0;}
编译命令:
gcc test.c main.c -o main
或者
[admin@localhost c]$ gcc -c test.c -o test.o[admin@localhost c]$ gcc -c main.c -o main.o[admin@localhost c]$ gcc test.o main.o -o main[admin@localhost c]$ ./main Hello WorldHello World
7. 编译的时候提示警告信息
可以通过-Wall命令来提示编译过程中的警告信息,对代码调试之类有帮助
gcc main.c -o main -Wall
8. 指定查找路径
如果我们上面这个例子的头文件放进cc/这个文件夹里面,这个时候main.c中需要下面的命令才能找到这个头文件。
命令:
gcc -I cc/ -c main.c -o main.o
9. 连接库文件
假如我们要连接线程的库文件,可以使用下面的命令
gcc main.c -o main -l pthread
- Linux c 开发 - gcc
- Linux下C开发之gcc,gdb的使用
- Linux下C开发——gcc,gdb的使用
- 嵌入式Linux C语言开发工具—编译器gcc详解
- Linux 下 C 开发—— gcc , gdb 的使用
- Linux下C开发之gcc,gdb的使用
- linux c 开发工具gcc gdb的使用:
- 【linux c开发】GCC 编译链接后找不到动态库
- linux+vim+gcc+gdb开发C&C++程序环境搭建
- linux gcc 编译 c
- Linux开发工具:gcc
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- linux gcc编译C程序
- gcc & gdb & 汇编 & linux c
- linux gcc编译C程序
- JavaScript核心
- 千万别相信鲁大师的硬件测温和CPU测温功能!!
- 关于linux播放器madplay对外提供接口与界面整合的总结
- hihocoder 1064 时间结界 扫描线
- 注定永远—— I will become the best "攻城狮"
- Linux c 开发 - gcc
- 字符串读取错误
- Java 基础 polymorphism(多态)
- 作为大型网站架构必须考虑的十大问题
- linux中mmap系统调用原理分析与实现
- 游戏服务器端开发要点
- HDU 1251 统计难题
- chapter6/c/ 下make报如下错误
- Modbus简介