2018-2019-1 20165330 《信息安全系统设计基础》第一周学习总结
学习内容总结
gcc编译器
- 命令格式:
gcc [格式] [文件名]
- 常用编译选项:
-E
:仅执行编译预处理-S
:将C代码转换为汇编代码-c
:仅执行编译操作,不进行连接操作-o
:指定生成的输出文件-I
:指定头文件目录-l
:指定程序要链接的库-L
:指定库文件所在的目录名
- 编译过程:
- 预处理:
gcc -E hello.c -o hello.i
- 汇编:
gcc -S hello.i -o hello.s
- 编译:
gcc -c hello.s -o hello.o
- 链接:
gcc hello.o -o hello
- 预处理:
- 多模块编译:
gcc *.c -o hello
静态库和动态库的生成与调用方法
- 静态库
- 生成
.o
文件:gcc -c -I/头文件所在路径 add.c sub.c mul.c div.c
- 生成静态库:
ar rcvs libmath.a add.o sub.o mul.o div.o
- 生成可执行文件:
gcc main.c -o main -I/头文件所在路径 -L. -lmath
- 生成
- 动态库
- 生成
.o
文件:gcc -fPIC -c -I/头文件所在路径 add.c sub.c mul.c div.c
- 生成动态库:
gcc -shared -o libmath.so add.o sub.o mul.o div.o
- 将文件
libmath.so
复制到目录/usr/lib中 - 生成可执行文件:
gcc main.c -o main -I/头文件所在路径 -L. -lmath
- 生成
- 共享库
- 创建一个共享的目标文件:
gcc -shared -fpic -o mymath.so add.c sub.c mul.c div.c
- 创建可执行目标文件:
gcc -o link main.c ./mymath.so
- 运行link:
./link
- 创建一个共享的目标文件:
makefile基本原理及语法规范
- 格式:
vim Makefile
- 编译:
make
- 运行:
./文件名
- 注意:在
vim makefile
中enter回车后在新一行的开头先用Tab键
gdb调试
- 编译:`gcc -g -I/头文件所在路径 main.c -o main
- 进入调试:
gdb main
- 查看某行程序:
(gdb) list n
- 查看
main.c
中的内容:(gdb) list main.c:1
- 运行程序:
(gdb) run
- 在某行设置断点:
(gdb) break n
- 查找帮助:
(gdb) help
- 退出gdb:
(gdb) quit
测试中遇到的问题及解决方法
- 在vi测试中遇到error
解决办法:发现当前已在main.c的目录下,-I空格后继续输入目录已多余,而且当前文件夹没有bin文件,所以之后我跳到总的大目录下成功
- 在进行gdb调试时出现
解决办法:原因是在源文件main.c中我并没有提前声明i<c中c的数值,导致不能读取断点设值
- 在进行makefile时出现
解决方法:原因是所在目录下没有
math.o
文件,在进行vi makefile
时错把main.o
输成了math.o
- 在进行共享库测试时,按照老师所发的视频我并没有成功调试出来,一直显示 不存在
-lmymath
目录
解决方法:一直没有搞懂怎么将文件
libmath.so
复制到目录/usr/lib中,但是我在网上发现了学姐用的另一种方法进行共享库的生成与调试:首先创建一个共享的目标文件:gcc -shared -fpic -o mymath.so add.c sub.c mul.c div.c
,接着创建可执行目标文件:gcc -o link main.c ./mymath.so
,最后运行link:./link
- 在进行git时出现错误提示fatal: 拒绝合并无关的历史
解决办法:通过参考git配置过程中fatal:拒绝合并无关的历史,输入其中的两条命令git成功