南京市建设执业资格中心网站,大连网站建设主页,上海百度seo牛巨微,适合建设网站的国外服务器一、编译流程
一个C程序从源代码到可执行程序一共有四个过程#xff1a;预处理-编译-汇编-链接
次序执行流程功能GCC命令1预处理展开头文件、宏替换、去掉注释、条件编译gcc - E main.c - o main.i2编译检查语法#xff0c;生成汇编程序gcc - S main.i - o mai…一、编译流程
一个C程序从源代码到可执行程序一共有四个过程预处理-编译-汇编-链接
次序执行流程功能GCC命令1预处理展开头文件、宏替换、去掉注释、条件编译gcc - E main.c - o main.i2编译检查语法生成汇编程序gcc - S main.i - o main.s3汇编汇编代码转换为机器码gcc - c hello.s - o main.o4链接链接各个文件一起生成可执行文件gcc main.o - o main
1. 预处理
预处理就是在C语言源文件和头文件中的所有以#开始的行都属于预处理的范畴预处理命令一般有一下几种
类别符号主要作用宏定义#define,#undef,#include基本上即使做字符替换条件编译#if,#else,#elif,#endif,#ifdef,#ifndef和C语言的分支语句一样不过这个告知编译器的信息输出#error,#warning分别输出错误级别信息和警告级别信息设置#line,#pragma向编译器发送一些指令
二、命令选项
o小写
指定生成(输出)文件名称如: gcc -o helloworld helloworld.c.
O大写
编译器的优化选项格式为-On(n0,1,2,3),默认为1,0表示不优化3表示最高优化级别
I
指定源文件所需要引用的头文件 目录(可以是相对路径), 如gcc -I./include test.c*
l小写
指定需要链接的库文件(去掉前缀lib和文件名后缀.so,.a)。 如
rootseven:~/projects/test# ls
hello.c hello.o liblog.so liblog.a libtest.so
libtest.a
rootseven:~/projects/test# gcc -o helo -llog -ltest -L./ hello.o注 当同一目录同时存在静态库和动态库时GCC默认链接动态库 当静态库和动态库在不同目录下时先检索到哪个库就链接哪个库。 L大写
指定非系统库文件路径之外的库路径。
D
指定通过命令行定义宏:-Dmaro | -Dmarovalue,可以用来在不修改源码的情况下编译不同版本的固件。 如
rootseven:~/projects/gcc# ls
gcc_test.c
rootseven:~/projects/gcc#
rootseven:~/projects/gcc# cat gcc_test.c
#include stdio.h
#if defined(Debug)
#define clog(format, ...) printf(format, ##__VA_ARGS__)
#else
#define clog(format, ...)
#endif // defined(Debug)#ifndef Num
#define Num 100
#endif // !Numint main(int argc, char **argv)
{printf(gcc test %d\n, Num);clog(Debug bin\n);return 0;
}
rootseven:~/projects/gcc# gcc -o gcc_rc gcc_test.c
rootseven:~/projects/gcc# gcc -DNum1 -o gcc_rc1 gcc_test.c
rootseven:~/projects/gcc# gcc -DDebug -o gcc_dbg gcc_test.c
rootseven:~/projects/gcc# ./gcc_rc
gcc test 100
rootseven:~/projects/gcc# ./gcc_rc1
gcc test 1
rootseven:~/projects/gcc# ./gcc_dbg
gcc test 100
Debug binX
指明使用的编程语言。允许的语言包括c c assembler none 。 none意味着恢复默认行为即根据文件的扩展名猜测源文件的语言。
E
仅进行预处理不生成文档会将信息直接打印到终端。
S
只进行预处理和编译把文档编译成汇编代码并生成*.s文件。
c小写
进行预处理编译和汇编,生成Object文件。
C大写
在预处理时不删除注释信息一般和E一起使用用于分析源码
w小写
禁止显示所有警告信息。
W大写
显示指定警告信息 格式为: -Woption1,option2
options说明all打开一些默认的警告项error将警告视为错误extra打印一些额外的警告信息pointer-arith对函数指针或void *类型指针进行算术操作时发出警告shadow当一个局部变量遮盖住另一个局部变量或者全局变量时发出警告undef当一个没有定义的符号出现在 #if 后时发出警告redundant-decls同一作用域内某定义多次声明发出警告……
ansi
支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。
std
指定遵守的语言标准
标准c89c99c11gnu99gnu11c98c11c14c17gnu11 98gnu11 11gnu11 14…
使用示例
生成可执行文件
最基础的就是直接使用命令gcc 然后将所有的C文件名作为参数输入
rootseven:~/projects/test# gcc -o test test_1.c test_2.c test_3.c生成库文件
库的生成和可执行文件的生成基本一致只是最后的链接阶段有些许差异。
动态库的生成
rootseven:~/projects/test# gcc -c hello.c -o hello.o
rootseven:~/projects/test# gcc -fPIC -shared -o libtest.so test.c静态库的生成
rootseven:~/projects/test# gcc -c hello.c -o hello.o
rootseven:~/projects/test# ar cqs libhello.a hello.o