Linux编译器-gcc/g++使用
1. 复习编译链接过程
2. 理解选项当中的含义
这些选项难记住,怎么办? – ESc - iso(对应)
gcc选项
- -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
- -S 编译到汇编语言不进行汇编和链接
- -c 编译到目标代码
- -o 文件输出到 文件
- -static 此选项对生成的文件采用静态链接
- -g 生成调试信息。GNU 调试器可利用该信息。
- -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
- -O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 - -w 不生成任何警告信息。
- -Wall 生成所有警告信息。
3. 动静态链接的认识
首先我们需要明确一点:我们自己实现的代码和库中的代码是两个概念
C标准库是别人已经编译好,提供我们使用的,而我们在使用库中的代码(printf)时,我们只是自己写了函数调用的接口,并没有对应的实现,只有当链接的时候对应的实现才和我们编译的代码所关联起来!
所以链接的本质:在调用库函数时是如何跟标准库建立关联关系的?
系统为了支持编译,给用户提供了什么?
系统给我们提供了标准库的.h (告诉我们怎么调用函数)和标准的动静态库.so/.a(告诉链接器函数的位置)
用户的代码+库代码 <==> 可执行程序
这些结论只在linux系统下有效嘛?
windows下的原理也是一样的,只不过windows下动态库是.dll 静态库是.lib
默认形成的可执行程序都是动态链接的
Linux项目自动化构建工具-make/Makefile
1. 背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
2. 使用
3. 理解其中的语法规则
4. 理解makefile的推导规则
Linux调试器-gdb的使用
调试是代码编写中不可或缺的一环
在windows下调试是通过F9 F10 F10 和可视化窗口进行调试
而Linux下呢? 是通过命令行进行调试
二者的调试思路是一样的,只不过是操作方式不一样罢了
1. gdb XXX
但为什么显示文件内容无法显示呢??
答案:默认情况下,gdb无法对现在发布的程序进行调试在Linux中,用gcc/g++生成软件时默认是release版本
2. 调试模式下的指令
2.1 l (list) 显示代码
2.2 添加/删除/查看断点
2.3 调试阶段