课程笔记

Linux 下编辑调试工具,gcc,gdb。

把高级语言编译成二进制可执行代码的工具。

需要经历四个步骤:

(1) 预处理:去掉注释,进行宏替换(#define相关),头文件(#include)包含等工作

gcc -E test.c -o test.i

(2) 编译:不同平台采用的汇编语言不一样。编译将高级语言编译成汇编语言。

gcc -S test.c -o test.s

(3) 汇编:将汇编语言翻译成二进制的目标代码

gcc -c test.c -o test.o

(4) 链接:包含各个函数库的入口,得到可执行代码。

gcc  test.c -o test

gcc编译器

使用 gcc 工具能够检查出语法错误,类型不匹配等问题。但不能解决bug。

Linux的C源代码文件后缀.c

.C  C++的代码

.cc  C++的代码

.h  头文件

其他选项:

优化:目标是使代码性能更优,去掉冗余代码。工具自动完成。
-O0/1/2/3

产生调试信息,gdb需要
-g0/1/2/3

提示警告
-Wall
-Werror
-D 在命令中定义宏,具体使用举例

指定头文件位置
-I

使用c99
-std=c99

gdb调试器

要解决bug,使用gdb调试器。
(1)在编译是,需要加上调试信息才可以,-g参数加到gcc编译过程。
l:list列出各行编号;
b 行号:在相应的行设置断点;
p 变量名:打印这个变量值;
r:run 执行代码
n:next下一行执行;
c:continue下一个断点;
exit:退出

示例代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello World\n");
return 0;
}
#include <stdio.h>

#define PI 3.14

int main(int argc, char *argv[])
{
printf("Hello World,%f\n", PI);
return 0;
}

当把程序改成:

#include <stdio.h>

#define PI 3.14

int main(int argc, char *argv[])
{
printf("Hello World,%d\n", PI);
return 0;
}

时,编译未报错:

gcc test.c -o test

但加了参数 -Wall 后,一条 warning信息 就出来了!

gcc test.c -o test -Wall

[root@localhost 3]# gcc test.c -o test -Wall
test.c: In function ‘main’:
test.c:6: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’

【 gcc 编译参数】

$ gcc --help
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
--help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]
显示特定类型的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
--version 显示编译器版本信息
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-print-sysroot 显示目标库目录
-print-sysroot-headers-suffix 显示用于寻找头文件的 sysroot 后缀
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-save-temps 不删除中间文件
-save-temps=<arg> 不删除中间文件
-no-canonical-prefixes 生成其他 gcc 组件的相对路径时不生成规范化的
前缀
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言 以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。

最新文章

  1. sqlmap 帮助信息
  2. JavaScript对浏览器的URL进行编码、解码
  3. Linux Found a swap file by the name filename
  4. ab压测&amp;htop工具
  5. C#注册表操作,根据键取值
  6. SharePoint 2013 开发——开发并部署webpart
  7. 12个git实战建议和技巧
  8. oracle 查询前一小时、一天、一个月、一年的数据
  9. 《剑指offer》— JavaScript(1)二维数组中的查找
  10. gnuplot画图中文标注相关问题
  11. [个人网站搭建]&#183;Django增加评论功能(Python3)
  12. js同步、异步、延时、无阻塞加载
  13. Spring Cloud项目MVN编译 -- Non-resolvable import POM
  14. python——函数之生成器
  15. ABP框架系列之五十一:(Timing-定时)
  16. char a=&#39;1&#39;和char a=1区别
  17. CAS-认证流程
  18. 17:54 思维导图coggle布置好了
  19. Core Location和MapKit的一些简单使用
  20. RSA library

热门文章

  1. shell中的&gt;&amp;1和 &gt;&amp;2是什么意思?
  2. HDU 4585 Shaolin(Treap找前驱和后继)
  3. 动态规划DP的斜率优化 个人浅解 附HDU 3669 Cross the Wall
  4. let与const区别
  5. Guns V2.5
  6. hibernate用配置文件的方式实现orm
  7. Asp .Net MVC中常用过滤属性类
  8. Linux Mint---更新软件源
  9. UVA 104 Arbitrage
  10. C++ DLL导出类 知识大全