week2目录
一、Vim or VSCode
- 每个*.c一个文件,每个*.h一个文件,文件名中最好有自己的学号
- 用Vim 或 VSCode输入图中代码,并用gcc编译通过
- 在Vim 中使用K查找printf的帮助文档(使用vim的)
- 提交Vim or VScode编辑过程截图,要全屏,包含自己的学号信息
代码如下:
add.c:
c
#include "head.h"
int add(int a,int b){
return a+b;
}
div.c
c
#include "head.h"
double div(int a,int b){
return a/b;
}
mul.c
c
#include "head.h"
int mul(int a,int b){
return a*b;
}
sub.c
c
#include "head.h"
int sub (int a,int b){
return a-b;
}
main.c
c
#include <stdio.h>
int main(void){
int a,b;
printf("enter two numbers:");
scanf("%d %d",&a,&b);
printf("add:%d\n",add(a,b));
printf("sub:%d\n",sub(a,b));
printf("mul:%d\n",mul(a,b));
printf("div:%d\n",div(a,b));
for(int i=0;i<2831;i++);
return 0;
}
head.h
c
#ifndef HEAD_H
#define HEAD_H
int add(int,int);
int sub(int,int);
int mul(int,int);
double div(int,int);
#endif
首先,创建这几个C语言文件及头文件
使用以下代码进行整体编译成一个文件。即2831:
bash
gcc *.c -o 2831
再运行:
bash
./2831
二、gcc测试
用gcc 进行预处理,编译,汇编,链接hello world程序,要求加一行打印自己学号姓名
生成的可执行文件中要有自己的8位学号
提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
新建helloworld.c文件
c
#include<stdio.h>
int main(){
printf("hello!20232831,ysc!");
}
GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接
如果使用以下代码,则直接一步到位,同时完成四个步骤直接生成可执行文件
bash
gcc helloworld.c -o helloworld
1、预处理(Pre-processing)
bash
gcc -E helloworld.c -o helloworld.i
2、编译阶段(Compiling)
将预处理输出文件helloworld.i汇编成helloworld.s文件
bash
gcc -S helloworld.i -o helloworld.s
3、汇编阶段(Assembling)
汇编阶段是把编译阶段生成的".s"文件转成二进制目标代码
bash
gcc -c helloworld.s -o helloworld.o
4、链接阶段(Link)
bash
gcc helloworld.o -o helloworld
5、执行可执行文件helloworld
三、gdb测试
- 用gcc -g编译测试1中输入的代码
- 在main函数中设置一个行断点
- 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
- 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
设置空循环如下:
gcc -g 生成main文件进行gdb测试(一定要生成,否则将出错)
bash
gcc -g main.c add.c sub.c div.c mul.c head.h -o main
使用gdb进行测试
b 8设置行断点
b 11设置条件断点(因为空循环在11行)
n(一直按n,即表示next下一执行,直至代码运行结束)
bash
gdb main
b 8
b 11 if i==1415 ##2831学号的一半
run
n
n
...
运行到条件断点处,会卡住几秒,因为要进入2831个for循环
运行结束后如图
继续按n,next执行,直到结束
The program is not being run.
四、静态库的测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
- 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
首先,分别编译四个.c文件
bash
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
gcc -c div.c -o div.o
gcc -c mul.c -o mul.o
生成mymath.a静态库
bash
ar rcsv mymath.a add.o sub.o div.o mul.o
生成main.o并与静态库进行链接,并生成link这个可执行文件进行调用静态库
bash
gcc -c main.c -o main.o
gcc -static -o link main.o mymath.a
使用./link运行
bash
./link
五、共享库的测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
- 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
直接运行生成动态库和链接的代码
bash
gcc -shared -fpic -o mymath.so add.c sub.c mul.c div.c
gcc -o link2 main.c ./mymath.so
更简单,结果如下
运行结果如下: