一、gcc的常用选项
- gcc使用方法
gcc 【选项】 【文件名】 - gcc -v :查看gcc的版本,显示gcc的详细执行过程
-o :可以指定输出的文件名
-E :只是预处理,不会编译、汇编和链接(一般默认会进行预处理)
-S :只是编译,不会汇编和链接
-c :编译和汇编,不会链接 - gcc编译可执行程序的方式
1)gcc hello.c 将生成a.out文件,不推荐
2)gcc -o hello hello.c 将生产hello可执行文件,推荐使用
3)gcc -c -o hello.o hello.c
gcc -o hello hello.o - gcc编译的详细过程
1 ) 预处理
预处理将宏定义展开,将条件编译选择,将c语言中的#define #ifdef等命令进行处理,生产hello.i 文件
gcc -E -o hello.i hello.c
2)编译
只编译,不会汇编或链接,生产hello.s
gcc -S -o hello.s hello.i
3)汇编
将汇编代码hello.s翻译成elf格式的机器代码,生成hello.o的obj文件;
gcc -c -o hello.o hello.s
4)链接
将汇编生产的obj文件,系统库的obj文件和库文件链接起来,生产可执行文件hello
gcc -o hello hello.o
二、gcc的一些特殊选项
5. -nostdlib
不链接系统标准启动文件和标准库文件,只把指定文件传递给连接器。这个选项常用于编译内核,bootloader 等程序,因为内核和bootloader不需要启动文件、标准库文件;
gcc -v -nostdlib -o hello hello.o
一般的程序编译时使用-nostdlib选项时,会提示失败,这是gcc没有链接系统标准启动文件和标准库文件。对于应用程序才需要系统标准启动文件和标准库文件;
6. 动态链接和静态链接
gcc 一般默认的是动态链接,可以用ldd hello查看hello应用程序使用到的动态链接文件;
1)动态链接(默认动态链接)
动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行;
动态库链接生产的程序较小,但是必须依赖所需的动态库,否则不能编译;
2)静态链接
静态链接使用静态库进行链接,生产的程序包括程序所需要的所有库,可以直接运行,静态链接生产的程序体积较大;
gcc -static -o static_hello hello.o