系统编程 基础工具
1.GCC
-
编译C语言用gcc,编译C++用g++
-
文件类型及后缀
-
原代码:test.c 、test.cpp
-
预处理后的代码:test.i
-
汇编代码:test.s
-
二进制文件:test.o
(可执行文件:.out 、.exe)
-
核心关系:通过编译,成为汇编代码,再通过汇编,成为二进制文件
-
-
文件之间的关系和它们的指令(不要死记硬背)
- gcc test.c :生成 默认的可执行文件a.out
- gcc test.c -o abc :生成 名为 abc 的可执行文件
- gcc test.c -E -o test.i:生成 名为 test.i 的预处理文件
- gcc test.i -S -o test.s:生成 名为 test.s的汇编文件
- gcc test.s -c -o test.o:生成 名为 test.o的二进制文件
- gcc test.s -s -o test.o:生成吗名为test.o的二进制文件并链接,及生成名为test.o的可执行文件
- gcc test.c -c -o test.o:可以直接从原代码变成可执行文件,中间过程都是可以跳跃的(直接跨到可执行文件的话,-c也可省略)
- 补充:
- gcc test.c -Wall:生成警告信息
- gcc test.c -On:n为(0,1,2,3),表示不同等级的优化,主要为了防止反汇编(O1是默认等级)
- gcc test.c -std=99:表示编译C语言的版本为C99
2.静态库、动态库
-
静态库的建立:
- 先使用 gcc add.c div.c mult.c -c ,生成 链接后的可执行文件,得到add.o,div.o,mult.o
- 再使用 ar rcs libcalc.a add.o div.o mult.o,将可执行文件打包到静态库calc中
-
静态库的使用:
gcc main.c -o app -Ⅰ ./include -L ./lib -l calc
- gcc main.c -o app 表示由main.c 生成一个可执行文件 app
- -Ⅰ ./include 表示 加入 头文件的路径
- -L ./lib 表示 加入 要使用的静态库的路径
- -l calc 表示 要使用的静态库的名称
-
动态库的建立:
- 先使用 gcc add.c div.c mult.c -c -fpic,多加了-fpic(必须有),表示生成 和位置无关的代码
- 再使用 gcc -o libcalc.so add.o div.o mult.o -shared,将可执行文件打包到动态库,注意后面有一个 -shared
-
动态库的使用——使用前必须 配置路径(可通过ldd查看是否配置完成),方法如下:
-
DT_RPATH段(不考虑)
-
配置环境变量 LD_LIBRARY_PATH :
-
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH :/home/nowcoder/Linux/lesson06/lib(动态库的pwd)
-
直接在当前终端写,那么作用范围仅限当前这一个终端窗口
-
在 ~/.bashrc 中写,还是一样的内容,但作用范围在所有终端窗口(写完之后还需要用source .bashrc 或 . .bashrc才能生效)
-
-
配置 /etc/profile
- export LD_LIBRARY_PATH = $LD_LIBRARY_PATH :/home/nowcoder/Linux/lesson06/lib(动态库的pwd)
- 写之前:sudo vim /etc/profile;写之后:source /etc/profile
- 方法2是用户级别的配置,而方法3是系统级别的配置
-
配置 /etc/ld.so.cache
- 直接把 动态库的路径(pwd)更新到这个文件中即可
- 写之前:sudo vim /etc/ld.so.conf;写之后:sudo ldconfig
-
/lib/、/usr/lib目录(不建议,因为可能覆盖系统自带的动态库)
-
-
动态库的使用——使用时要同时指明头文件的路径、动态库的路径、库的名字:
gcc main.c -o app -Ⅰ ./include -L ./lib -l calc
- gcc main.c -o app 表示由main.c 生成一个可执行文件 app
- -Ⅰ ./include 表示 加入 头文件的路径
- -L ./lib 表示 加入 要使用的 动态库的路径
- -l calc 表示 要使用的 动态库的名称
3.Makefile
-
定义:用于 统一编译 的工具,在 Makefile 里面写好 该怎么编译,然后输入make,即可直接运行当前文件夹里的 Makefile,实现统一编译
-
怎么写:
main:add.c div.c
gcc add.c div.c -c -o main
- main 为 目标,add.c div.c 为 依赖,gcc add.c div.c -c -o main 为 指令
- 指令前必须要有缩进
-
特性:
-
Makefile 里可以有 多条编译规则,但是其他的规则 必须能为 第一条规则服务。如果不能,那么这条规则就不会执行,只 执行第一条规则
-
如图,其他规则都是为第一条规则提供服务
-
-
检查更新:当 Makefile 中的依赖没有更新时,使用 make命令,就不会使用 Makefile 了,因为这时main.o已是最新
-
-
优化:
-
变量
-
定义方法和一些特殊符号
-
实际例子
-
-
-
模式匹配
- 和上图是同一个例子。用模式匹配了,就不需要那么多辅助的规则了
-
函数
-
wildcard 作用是找到并展示所有符合条件的文件,使用:$(wildcard 文件1 文件2)
-
-
patsubst 作用是转变类型,只要符合条件就行,使用:
-
表示如果 x.c 和 bar.c 符合 %.c,那么就将它们转换为 %.o 类型的
-
汇总(如果没有疑问,说明都掌握了,附:clean的用法)
4.GDB
-
定义:一个调试工具
-
使用:
- gcc test.c -c -o test -g,在正常的指令后面要加一个 -g,从而让可执行文件test 含有 test.c的信息
- gdb test 即可
-
简单命令——查看:
-
核心命令——断点、调试