9月27日课堂检测补交
今天的课堂检测一共有五项,分别是vi测试、gcc测试、gdb测试、静态库的测试、共享库的测试。由于自己的学习不到位,导致有最后两个没有完成,特别在此加以补做。
对之前完成的三个检测,我学到了一些新知识:
gcc *.c
:将当前文件夹里的所有.c 文件进行整体编译,编译后的文件名默认为a.out
1. 静态库测试:
1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
2. 提交静态库生成和调用过程截图,要全屏,包含自己的学号信息
解决方案:
Step 1:创建静态库:
在参考教材的第476页对实现静态库这样的两行命令:
linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o
对这两行命令的理解我也是通过SCDN博客中一篇名为《Linux命令之ar - 创建静态库.a文件》中找到了比较详尽的解释:
- 使用
gcc -c ···.c ···.c ···.c
把要将创建的静态库所包含的.c文件编译为.o文件。 - 使用
ar rcs ···.a ···.o ···.o ···.o
由以上编译出来的.o文件创建静态库。(在我自己的操作中根据题意命名为mymath)
Step 2 :创建可执行文件(即在在程序中使用静态库)
因为是静态编译,生成的执行文件可以独立于.a文件运行。
gcc -c main.c
gcc -static -o ··· main.o ./···.a
通过以上的两行命令将创建的.a文件链接到main.o上,创建出一个可直接运行的文件(在我自己的操作中命名为prog4c)
自己动手操作后的结果:
Step 1:
Step 2:
2. 动态库测试:
1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
2. 提交共享库生成和调用过程截图,要全屏,包含自己的学号信息
解决方案:
Step 1:创建动态库:
在参考教材的第486页对实现动态库这样的一行命令:
linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c
对这行命令的理解:使用 gcc -shared -fpic -o ···.so ···.c ···.c
创建了一个共享的目标文件。
Step 2 :创建可执行文件(即在在程序中使用动态库)
linux> gcc -o prog21 main2.c ./libvector.so
使用 gcc -o ··· main.c ./···
创建了一个可执行的文件(在我自己的操作中命名为prog4s)
自己动手操作后的结果:
Step 1:
Step 2:
MakeFile
对于MakeFile我的脑海中可以说是一片空白,什么都不知道,多亏我们生长在一个技术发达、知识大爆炸的年代,通过查询ruglcc的博客我知道了
第一:Makefile的
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
第二:我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
流程:
- 利用vim编写Makefile:
- 使用make将编写好的文件进行编译
- 运行编译好的文件(5334test)
Myod
代码托管连接
代码托管连接
感想:
通过这次的补交作业让我真真切切的体会到了实践出真知的道理,面对之前毫无头绪的问题,怨天尤人是无济于事的,只有脚踏实地的去一步一步的操作,一点点的查漏补缺才能真正的掌握它。