#include<stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
cloudray@ubuntu:~/test/testc$ gcc -o test hello.c
cloudray@ubuntu:~/test/testc$ ls
hello.c test
cloudray@ubuntu:~/test/testc$ ./test
Hello World!
GCC简介
GCC,全名GNU编译器套件(GNU Compiler Collection)。由GNU开发的编程语言编译器,包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)。
支持在各种处理器架构上使用。
(ps:关于GNU可以继续深入了解)
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user's freedom.
GCC, the GNU Compiler Collection - GNU Project
编译器组件
分析器:将程序语言变为汇编程序
汇编器:将汇编语言转换为CPU可执行字节码(二进制)
链接器:将汇编器生成的单独目标文件组合成可执行的应用程序。链接器需要知道这种目标格式一边工作。
标准C库:主要与常用的C程序库,通过链接器与源代码连接。
支持后缀
文件后缀 | 描述 |
---|---|
.c | C语言源文件 |
.C/.cc/.cxx/.cpp | C++ 源文件 |
.h C/C++ | 头文件 |
.i/.ii | 经过预处理的 C/C++ 文件 |
.s/.S | 汇编语言源文件 |
.o/.obj | 静态库 |
.so/.dll | 动态库 |
.a/.so | 编译后的库文件 |
GCC基本参数
命令 | 作用 |
---|---|
-c | 只进行编译过程,而不链接成可执行文件,编译器只是将输入的源代码(.c/c++、java、python等)生成.o为后缀的目标文件(objective file),通常用于编译不包含主程序的子程序。 |
-o | 确定输出文件名,注意输出文件名不能和源文件同名;如果不给出该调用参数,gcc就给出默认的可执行文件a.out。 |
-g | 生成符号调试工具(GNU的gdb)所需要的符号信息,想要对源代码进行调试,必须加入这个选项。 |
-E | 仅执行预处理操作,而不进行编译、汇编和链接操作。 |
-S | 仅执行编译操作,而不进行汇编、链接操作 |
-O | 对程序进行优化编译、链接操作,提高可执行文件的执行效率,但编译链接也会慢一点。 |
-O2 | 更高级别优化,也会更慢。 |
-w | 禁止显示任何警告信息 |
-Wall | 显示全部警告信息 |
编译流程
1. 预处理(Pre-Processing)
2. 编译(Compiling)
3. 汇编(Assembling)
4. 链接(Linking)
逐步生成可执行文件
cloudray@ubuntu:~/test/testc$ gcc -E hello.c -o hello.i #包含头文件
cloudray@ubuntu:~/test/testc$ gcc -S hello.c -o hello.s #汇编代码
cloudray@ubuntu:~/test/testc$ gcc -c hello.s -o hello.o #二进制文件
cloudray@ubuntu:~/test/testc$ gcc hello.o -o hello #可执行文件
cloudray@ubuntu:~/test/testc$ ./hello
Hello World!
常见错误
- C语法错误
- 头文件错误
- 档案库错误
- 未定义错误
GDB调试基础
Unix下的调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:
1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2. 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3. 当程序被停住时,可以检查此时你的程序中所发生的事。
4. 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
基础命令。
命令(简写) | 作用 |
---|---|
gdb -t .c | 生成可调试的可执行文件 |
gdb 可执行文件 | 进入该文件的调试界面 |
list(l) | 显示接下来的十行代码 |
start | 开始调试,在主函数第一行处停止(即自动设置断点) |
run(r) | 运行(遇到断点才停止) |
next(n) | 逐步执行 |
break(b) | 设置一般断点,可在特点行数或者函数处设置 |
info break(b) | 查看所有断点信息 |
s | 进入下一个将要运行的函数 |
p | 查看特定变量值 |
quit(q) | 退出gdb调试 |
回车 | 重复上一条命令 |
示例
#include <stdio.h>
int sum(int a, int b);
int fun(int a, int b);
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("开始\n");
printf("a+b=%d\n", sum(a, b));
fun(a,b);
return 0;
}
int sum(int a,int b)
{
return (a + b);
}
int fun2(int a, int b);
int fun(int a,int b)
{
printf("axb=%d\n",a*b);
fun2(a,b);
return 0;
}
int fun2(int a,int b)
{
printf("a/b=%d\n",a/b);
return 0;
}
第一步:生成调试文件
gcc -g test.c -o test
第二步:进入该文件的调试界面
gdb 可执行文件
显示代码:list(l)
一次显示10行,回车表示重复上次命令。
开始运行:run(r)
直到所设断点。
设置一般断点,并查看所有断点情况。
break(b)
info break(b)
逐步执行:next(n)
先自动运行到断点处,再逐步执行,回车重复,且不进入内部函数。
开始调试:start
停留在主函数第一行。
进入函数:s
逐步调试,但会进入每一个内部函数,包括printf。
退出函数:finish
查看与打印变量或地址:print(p)
退出调试: quit(q)