gcc编译常用命令:
假设编译.c源文件
(1)无选项编译链接
命令:gcc test.c
作用:将test.c预处理、编译、汇编和链接形成可执行文件,默认输出为a.out;
(2)选项 -o
命令:gcc test.c -o test
作用:将test.c预处理、编译、汇编和链接形成可执行文件test,-o用来指定输出文件名及格式;
(3)选项 -E
命令:gcc -E test.c -o test.i
作用:将test.c预处理,输出到test.i文件;
命令:gcc -E test.c
作用:将test.c预处理后的代码输出到标准输出(默认为屏幕)上;
(4)选项 -S
命令:gcc -S test.i 或 gcc -S test.i -o test.s
作用:将预处理后的文件test.i汇编成test.s文件;
(5)选项 -c
命令:gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件;
(6)选项 -o
命令:gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test;
(7)选项-O
命令:gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长;
gcc支持的后缀名
- .c C源程序
- .C C++源程序
- .cc C++源程序
- .cxx C++源程序
- .n Objective-C源程序
- .i 预处理过的C程序
- .ii 预处理过的C++程序
- .s 编译过后的汇编程序
- .ss 编译过后的汇编程序
- .h 头文件
- .o 目标文件
- .a / .so 编译后的库文件
gcc指令一般格式:
gcc [参数] [要编译的文件] [参数] [目标文件]
gcc编译.c文件流程:
源代码(.c)->预处理->编译->汇编->链接->可执行文件
gcc一般参数:
- -c 只是编译不链接,生成目标文件
- -S 只是编译不汇编,生成汇编代码
- -E 只进行预编译
- -g 在可执行文件中包含调试信息(与下一篇的必须命令)
- -o file 把输出文件输出到file中
- -v 显示gcc的版本信息
- -I dir 在头文件的搜索路径中添加dir目录
- -L dir 在库文件的路径列表中添加dir目录
- -static 链接静态库
- -library 连接名问library的库文件
gcc告警与出错参数:
- -ansi 支持符合ANSI的C程序
- -pedantic 允许发出ANSI C标准所列的全部警告信息
- -pedantic -error 允许发出ANSI C标准所列的全部错误信息
- -w 关闭所有告警
- -Wall 允许发出gcc提供的所有的告警信息
- -werror 把所有的告警信息转化为错误的信息,并在告警发生时终止编译
函数库:
c程序中,没有定义一些系统函数的实现,预编译中的stdio.h也只包含该函数的声明,没有该函数的实现,如何实现这些函数的调用?
系统把这些函数的实现都做到名为 libc.os.6 的库函数中,在没有特别指定时,gcc会到系统默认的搜索路径"usr/lib"下进行查找,也就是链接到libc.os.6库函数中去,实现系统函数的调用;
静态库与动态库:
静态库指编译链接时,把库文件的代码全部加入到可执行文件中,生成的文件较大,但在运行时就不需要库文件函数了。其后缀为.a;
动态库指在编译时没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库。gcc在编译时默认使用动态库。