8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
gcc编译器
gcc编译流程
【Tips】
* Linux的可执行文件没有Windows那么明显的.exe扩展名,只需向其分配x权限即可。
sudo chmod u+x filename
* gcc可以在编译的任何阶段结束,以便检查或使用该阶段的输出。
gcc支持编译的扩展名
扩展名源文件.cC语言源代码文件
.C .cc .cppC++源代码文件
.h头文件
.a存档文件
.i经过预处理的C源代码文件
.ii经过预处理的C++源代码文件
.s汇编语言源代码文件
.S经过预编译的汇编语言源代码文件
.o编译后的目标文件
gcc参数
参数作用-o指定生成的输出文件
-s将C代码转换为汇编代码
-c仅执行编译操作,不进行链接操作
应用
无参数编译
gcc a.c
将a.c预处理、汇编、编译、链接成可执行文件。未指定输出则默认a.out
指定输出的文件
gcc a.c -o do
指定a.c输出为do可执行文件
gcc a.c -o /tmp/do
指定输出为/tmp目录下的do文件
多源文件的编译多个文件一起编译
gcc a.c b.c -o do
将a.c和b.c分别编译后链接成do文件
分别编译各个源文件,对编译后输出的目标文件链接gcc -c a.c #将a.c编译成a.o
gcc -c b.c #将b.c编译成b.o
gcc -o a.o b.o -o do #将a.o 和 b.o 链接成do123
以上两个方法,第一个方法编译时需要重新编译所有文件,第二个只重新编译修改的文件,未修改的文件不用重新编译。
查看编译过程
gcc -v a.c
查看编译过程和显示调用的库。
C程序的编译
编写C程序
使用VIM编写简单的C程序。
1. 打开终端
2. 在用户家目录下新建一个c文件夹
mkdir ~/c
3. 打开VIM。vim
4. 编写C程序int (){
printf("hello");
return 0;
}12345编写完成后,按Esc返回到普通模式,保存文件到家目录下的c文件夹,保存为a.c
:wq ~/c/a.c
使用gcc编译打开终端,进入上文创建的~/c文件夹。
cd ~/c
使用gcc编译
gcc a.c -o a
执行编译出的可执行文件
./a
编译过程详解
* 预处理:对预编译语句(如宏定义define)和文件包含进行处理。需要完成的工作室对预编译指令进行替换,把包含文件放置到需要编译的文件中。最终生成一个非常完整的C源文件。
* 编译:对预处理后的文件编译,生成.s的汇编语言文件。
* 汇编:处理汇编语言。调用汇编处理程序将汇编语言汇编成二进制代码。最终生成.o目标文件。
* 链接:将多个汇编生成的目标文件以及引用的库文件进行模块链接生成一个完整的可执行文件。
gdb调试器
gdb简介
主要使用gdb进行下面5个方面的操作:
* 启动程序:在启动程序时,可以设置程序运行环境。
* 设置断点:这里的断点可以使行数、程序名称或条件表达式。
* 查看信息:断点停止后,可以查看程序的运行信息和显示程序变量的值。
* 分步运行:使程序一个个语句的执行。
* 改变环境:可以在程序运行时改变程序的运行环境和程序变量。
在程序中加入调试信息
为了使用gdb进行调试,需要在编译程序中加入供gdb使用的调试信息。使用-g参数
gcc -g -o a.debug a.c
编译a.c生成一个a.debug的可执行程序,其中加入了供调试所用的信息。
gdb的使用
启动gdb
在终端输入
gdb
加载需要调试的程序
file a.debug
运行结果如下,证明已加载此文件。
Reading symbols from /home/tian/a.debug ...done
在gdb中查看代码
用gcc -g编译后的a.debug程序加入了断点。可以用list查看程序的源代码和断点。
1.list 1,会显示第一个断点前的代码。以上文a.c为例,会显示以下:
2.按Enter键会显示下一个断点前的代码。
加入断点
break命令可以增加断点。如在上文的例程第3行增加一个断点。
break 3
查看断点
info break
运行程序run运行程序
next在下一行停下
continue在下一个断点位置停下
step单步运行。
step与next类似,都可以实现单步运行。不同的是,在遇上函数调用时,step可以进入函数内部,next跳过函数的调用
变量的查看
退出调试
q
gdb常用命令backtrace:显示程序中的当前位置和表示如何到达当前位置的栈跟踪
cd:改变当前工作目录
clear:删除刚才停止处的断点
delete:删除一个断点
display:程序停止时显示变量和表达式
info files:显示被调试文件的信息
info func:显示所有的函数名称
info local:显示所有的局部信息变量
info var:显示所有的全局和静态变量名称
whatis:显示变量或函数类型