gcc常用参数

转自:http://man.linuxde.net/gcc

gcc常用参数


选项

-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。

无选项编译链接

gcc test.c

将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

选项 -o

gcc test.c -o test

将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

选项 -E

gcc -E test.c -o test.i

将test.c预处理输出test.i文件。

选项 -S

gcc -S test.i

将预处理输出文件test.i汇编成test.s文件。

选项 -c

gcc -c test.s

将汇编输出文件test.s编译输出test.o文件。

无选项链接

gcc test.o -o test

将编译输出文件test.o链接成最终可执行文件test。

选项 -O

gcc -O1 test.c -o test

使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

多个文件一起编译

gcc testfun.c test.c -o test

将testfun.c和test.c分别编译后链接成test可执行文件。

分别编译各个源文件,之后对编译后输出的目标文件链接。

gcc -c testfun.c    #将testfun.c编译成testfun.o
gcc -c test.c       #将test.c编译成test.o
gcc -o testfun.o test.o -o test    #将testfun.o和test.o链接成test

以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。


选项 -I(INCLUDE)

gcc -I ./my_header_files test_code.c ... -o test_code

-I选项告诉gcc编译器还可以去哪里找头文件。编译器会 先检查-I选项中的目录,然后像往常一样检查所有标准目 录。

选项 -l(link) -L

gcc test_code.c -L ./my_lib -lhfsecurity -o test_code

-L选项告诉编译器去哪个目录查找存档
-lhfsecurity叫编译器去找一个叫libhfsecurity.a的存档

nm命令

nm命令被用于显示二进制目标文件的符号表,主要是函数和全局变量,目标文件主要是库文件和可执行文件(如.a,.o);

ar命令

ar -rcs libhfsecurity.a encrypt.o checksum.o

存档命令(ar)会在存档文件中保存一批目标文件

-fPIC

gcc -I/includes -fPIC -c hfcal.c -o hfcal.o

-fPIC。它告诉gcc你想创建位置无关代码

-shared

gcc -shared hfcal.o -o ./libs/libhfcal.so

-shared选项告诉gcc你想把.o目标文件转化为动态库

在Linux和大部分Unix中,编译器只会记录libhfcal.so库的文件名, 而不会包含路径名。也就是说如果不把hfcal库保存到标准目录(如 /usr/lib),程序就找不到它。为了解决这个问题,Linux会检查保 存在LDLIBRARYPATH变量中的附加目录。只要把库目录添加 到LDLIBRARYPATH中,并export①它



编译步骤

1. 预处理:修改代码。

编译器要做的第一件事就是修改代码。编译器需要用#include指令 添加相关头文件;编译器可能还需要跳过程序中的某些代码,或补充 一些代码。改完以后就可以随时编译源代码了。

2.编译:转换成汇编代码。

C语言看似底层,但计算机还是无法理解它。计算机只理解更低层 的机器代码指令。而生成机器代码的第一步就是把C语言源代码转 化为汇编语言代码,看起来像这样:

movq -24(%rbp), %rax
movzbl (%rax), %eax
movl %eax, %edx

3.汇编:生成目标代码。

编译器需要将这些符号代码汇编成机器代码或目标代码,即 CPU内部电路执行的二进制代码。

10010101 00100101 11010101 01011100

4.链接:放在一起。

一旦有了全部的目标代码,就需要像拼“七巧板”那样把它们拼在 一起,构成可执行程序。当某个目标代码的代码调用了另一个目标 代码的函数时,编译器会把它们连接在一起。同时,链接还会确保 程序能够调用库代码。最后,程序会写到一个可执行程序文件中, 文件格式视操作系统而定,操作系统会根据文件格式把程序加载到 存储器中运行。



阅读更多
文章标签: gcc
个人分类: cLanguage
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭