2017-2018-1 20155225 《信息安全系统设计基础》第2周课堂实验
-
ifndef的用法
作用:防止头文件被重复包含。最好将头文件的内容都放在#ifndef和#endif中。格式:
#ifndef <标识x>//测试x是否被宏定义过
#define <标识x>//如果没有宏定义,就宏定义x并编译下面的语句
......
#endif//如果已经定义了则编译#endif后面的语句
标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线。
- 在Vi中使用K查找帮助文档
我们使用vim编辑shell脚本或者c/c++文件时,我们可能需要查找某个命令或者函数的手册,最简单的方法是:将光标移动到需要查找帮助的关键字上,按下
K
vim会对光标所在的单词执行"man"程序,找到就显示,用的是默认分页程序来处理上下滚动,到达帮助内容底部时按会回到vim.
这是我在vim中使用K查找printf的帮助文档:
- 生成并调用静态库
ar命令——创建静态库.a文件,命令格式如下:
ar rcs libxxx.a xx1.o xx2.o
参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
参数c:创建一个库。不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)
如图所示,新产生了mymath.a文件。
再编译、链接main.o和mymath.a,生成可执行文件
gcc -static -o 5225 main.o ./mymath.a
如图所示产生了可执行文件5225(绿色):
- 生成和调用动态库
gcc -shared -fpic -o libmymath.so add.c div.c mul.c sub.c
注意:生成静态库的时候是将.o文件生成.a文件,动态库是直接将.c生成.so。
再将这个库链接到程序中即可。
gcc -o 5225_2 main.c libmymaht.so
5.用显示规则写Makefile。
之前不知道什么是makefile,找了几篇博客学习了一下,有个大概了解吧:
其实上课做实验的时候就发现了这个问题:程序调试的时候,我发现了main.c写错了,然后我改了main.c,再编译链接却发现运行还是原来main.c的结果,原来我用的是原main.c生成的main.o来链接的,于是我只能删了原main.o重新编译一个mian.o。当时感觉这个问题很烦人!没想到有makefile就是帮我解决这个问题的!
makefile的作用就是自动编译,格式如下:
target... : prerequisites ...
command
target也就是一个目标文件,可以是Object File,也可以是执行文件。
prerequisites是生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
对于我们这个程序有五个C文件,一个头文件。我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
我写的Makefile如下(还带有clean命令):
对Makefile测试如下:
这是用make命令,第一次编译,生成了可执行calculator,运行发现是为了固定了a,b的计算器。
然后打开main.c修改之后,再用make编译,发现自动先编译了main.c,再进行的链接。再运行就直接是获得用户输入的计算器了。
5.编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
在linux里od -tx1 -tc XXX 的功能:按指定格式输出文件内容,-tx1表示以十六进制、一个字节为一组显示。-tc表示显示ASCII字符或者反斜杠。效果如图所示:
重新学习了C语言文件处理,但在linux里写C程序还是稍有不同,首先是文件名通过命令行参数传过去的,这个怎么弄?参考了Linux 程序设计学习笔记----命令行参数处理 ,解决了这个问题。
写好程序后,发现文件读出来是这种样子???为什么文件后面有一段fffff的乱码?为什么我设置的16个字节换行,在第二行就不行了?
经过我反复调试和修改,发现之所以后面有一段乱码是因为我设置为16个字符为一次循环,如果最后一行不满16个就会输出乱码,需要在最后设计一个标记,循环到标记处就break。
针对第二行提前换行的情况,我直接分开用两个循环,解决了这个问题。最终结果如下: