一、使用gcc
1、gcc -v 查看gcc的版本
2、gcc f1.c -o f2
或者:gcc f1.c
f1.c文件代码:
#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
二、用gcc编译多个源文件程序
//mul1.c
#include<stdio.h>
#include "mul2.h"
int main()
{
printf("Hello World!\n");
f();
return 0;
}
//mul2.c
#include<stdio.h>
int f()
{
printf("int f().\n");
return 0;
}
//mul2.h
void f();
gcc mul1.c mul2.c -o mul
用一条gcc命令编译多个源文件的缺点:每个文件都要重新编译,比较费时间。
三、gcc的警告和提示
1、gcc包含完整的出错检查和警告提示功能,可以帮助程序员尽快找到错误的代码。
2、gcc包含30多个警告和3个警告级别。
四、一个不好的例子
//bad.c
#include<stdio.h>
void main(void)
{
long long int var = 3;
printf("this is not a standard c program!\n");
}
该代码不好的地方有:
1、main函数没有使用return语句返回int类型值
2、变量var未使用
实际编译结果:
五、gcc的警告选项
1、-Wcomment,如果出现注释嵌套则警告(/* 后出现 /*)
2、-Wformat,如果传递给printf的参数与指定格式不匹配则告警
3、-Wmain,如果main的返回类型不是int或者调用main时参数不正确则告警
4、-Wparentheses,根据上下文推断,如果(n==10)写作(n=10)则警告
5、-Wswitch, 如果switch中少了一个或者少了多个case分支(仅对enum适用)则警告。
6、-Wunused, 变量声明了但未使用,或者static类型函数未被调用则警告
7、-Wuninitialized, 使用的自动变量没有初始化则警告
8、-Wundef, 如果在#if宏中使用了未定义的变量做判断则警告
9、-Winline,函数不能被内联则警告
10、-Wmissing-declarations, 如果定义了全局函数,但却没有在任何头文件中声明则警告
11、-Wlong-long, 使用了 long long类型则警告
12、-Werror, 把所有的警告转变为错误
六、gcc的库依赖
1、函数库:头文件(.h)+库文件(.so,.a)
2、系统能够识别的默认路径:
(1)头文件:/usr/include
(2)库文件: /usr/lib
3、使用默认路径的文件需要在编译时指定路径
(1)头文件用 “-I”【大写的i】
(2)库文件用"-L",-l(小写的L)后的参数指明要寻找库"libkk.so"
例:gcc k.c -I /home/include -o k
gcc k.c -L /home/lib -lkk -o k
七、gcc的优化选项
1、代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。
2、gcc代码优化采用“-On”选项
(1)-O,-O1,同时减小代码的长度和执行时间
(2)-O2,包括-O的功能,以及指令调整等调整工作
(3)-O3,包括-O2的功能,以及循环展开等工作
八、优化的实例
//optimize.c
#include<stdio.h>
int main()
{
double counter;
double result;
double temp;
for(counter = 0; counter < 4000.0*4000.0*4000.0/20.0 + 2030; counter += (5 -3 + 2 + 1)/4)
{
temp = counter/1239;
result = counter;
}
printf("the result is %1f\n", result);
return 0;
}
1、分别使用以下选项编译程序
(1)不优化,直接编译
gcc optimize.c
(2)优化,编译
gcc optimize.c -o optimize
2、运行两个程序,比较运行时间
可以看到,优化后的程序,运行时间确实是减少很多。