linux GCC编译C程序
GCC已不再是主要针对GNU项目自身的软件的小型C语言编译器了。如今,它已支持了许多不同的语言,包括C、C++、Ada、Fortran、Objective C,甚至还有Java。
利用gcc
原理上是经过两步编译的,分别生成目标代码和Linux可执行程序。
1. 编译单个源文件
hello_linux.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
printf("Hello linux\n");
return 0;
}
使用如下命令编译并运行:
gcc hello.c -hello
./hello
默认情况下产生可执行程序程序名为a.out
;可以通过gcc的-o
参数指定生成可执行文件名称
2. 编译多个源文件
message.c
#include<stdio.h>
void goodbye_world(void)
{
printf("Goodbye,world\n");
}
main.c
#include<stdlib.h>
void goodbye_world(void);
int main(int argc,char **argv)
{
goodbye_world();
return 0;
}
使用gcc编译这两个源文件,合并为一个可执行文件
gcc message.c -c
gcc main.c -c
gcc main.o message.o -o goodbye_world
使用gcc的-c
参数编译支持库代码,输出为一个同名的后缀为.o
的目标代码文件。它包含连接到一个较大程序的已编译目标代码。
最后将两个目标代码合并为一个可执行程序。
名的后缀为.o
的目标代码文件。它包含连接到一个较大程序的已编译目标代码。
最后将两个目标代码合并为一个可执行程序。
3. 使用外部函数库
tric.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_INPUT 25
int main(int agrc, char **argv)
{
char input[MAX_INPUT];
double angle;
printf("Give me an angle (in radians) ==>");
if(!fgets(input, MAX_INPUT, stdin)){
perror("an error occurred.\n");
}
angle = strtod(input, NULL);
printf("sin(%e) = %e\n", angle, sin(angle));
return 0;
}
编译命令
gcc -o trig -lm trig.c
GCC参数-lm
,调用系统提供的数学库(libm)
4. 共享函数库&静态函数库
LINUX程序函数库分为3种类型:静态函数库、共享函数库、动态加载函数库。
静态函数库:在编译时,引用的代码会被直接包含到程序中。
共享函数库(=动态加载函数库):在当一个可执行程序启动时才被加载。
5. 常用参数表
选项 | 选项描述 |
---|---|
-c | 只对文件进行编译和汇编,但不进行连接,生成目标文件”.o” |
-S | 只对文件进行编译,但不汇编和连接 |
-E | 只对文件进行预处理,但不编译汇编和连接 |
-g | 在可执行程序中包含标准调试信息 |
-o file1 [file2] | 将文件file1编译成可执行文件file2 |
-v | 打印出编译器内部编译各过程的命令行信息和编译器的版本 |
-I dir | 在头文件的搜索路径列表中添加dir目录 |
-L dir | 在库文件的搜索路径列表中添加dir目录 |
-static | 强制链接静态库 |
-lNAME | 连接名为libNAME的库文件 |
-Wall -W | 开启GCC最常用的警告,GCC的warning一般格式为file:line-number:message |
-pedantic | 要求严格符合ANSI标准 |
-Wconversion | 开启隐式类型转换警告 |
-Wshadow | 开启同名变量函数警告 |
-Wcast-qual | 开启对特性移除的cast的警告,如const |
-O(-O1) | 对编译出的代码进行优化 |
-O2 | 进行比-O高一级的优化 |
-O3 | 产生更高级别的优化 |
-Os | 产生最小的可执行文件 |
-pg | 开启性能测试,记录每个函数的调用次数与时长 |
-ftest-coverage | 记录每一行被执行的次数 |
-fprofile-arcs | 记录每个分支语句执行的频率 |
-m32(64) | 生成32(64)位机器的汇编代码 |