一、实验任务
- 在Ubuntu活openEuler中完成任务(推荐openEuler).
- 编写C代码hello.c,打印“hello你的8位学号”,给出编译预处理,编译,汇编,链接的gcc命令,及其运行结果,使用git记录过程。(5分).
- 编译附件中代码,给出运行结果。(5分)
- 新建目录,拷⻉要求2中代码,把代码中的main函数都去掉,编写ble.h(包含五个判断函数),main.c通过命令行参数调用,比如./main1调用cebitwise.c中的功能。编译运行代码,给出运行结果。使用git记录过程(5分).
- 新建目录,拷⻉要求3中代码,制作静态库libble.a,并调用libble.a,编译运行代码,给出运行结果。使用git
记录过程(5分). - 新建目录,拷⻉要求3中代码,制作动态库libble你的八位序号.so,并调用libble.so,编译运行代码,给出运行结果。使用git记录过程(5分).
- 新建目录,按下面目录拷⻉要求3中代码,编写Makefile编译运行代码,给出运行结果。使用git记录过程(4分)
二、实验步骤
1、编写hello.c
- 编写程序并运行
hello.c
// hello.c
#include <stdio.h>
int main() {
printf("hello 20242817\n");
return 0;
}
- 分步编译命令:
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 # 链接生成可执行文件
- 运行结果:
./hello
实验截图如下:
- Git记录
git init
git add hello.c
git commit -m "Add hello.c"
2、编译附件中代码,给出运行结果
3、新建目录,拷⻉要求2中代码,把代码中的main函数都去掉,编写ble.h(包含五个判断函数),main.c通过命令行参数调用,比如./main1调用cebitwise.c中的功能
- 新建文件夹task3并把原文件夹中的文件进行拷贝
mkdir task3 && cd task3
cp ../cebitwise.c ../cebitfields.c ../celibrary.c ../cepointer.c ../ceunion.c .
- 删除所有main函数
以cebitfields.c 为例
#include <stdio.h>
void check_endian_bit_field() {
struct {
unsigned int a:8;
unsigned int b:8;
unsigned int c:8;
unsigned int d:8;
} test;
test.d = 0x12;
test.c = 0x34;
test.b = 0x56;
test.a = 0x78;
unsigned char *p = (unsigned char *)&test;
if (*p == 0x78) {
printf("Little Endian (Bit-field Method)\n");
} else {
printf("Big Endian (Bit-field Method)\n");
}
}
- 编写头文件 ble.h
#ifndef BLE_H
#define BLE_H
void check_endian_bit_field();
void check_endian_bitwise();
void check_endian_standard();
void check_endian_pointer();
void check_endian_union();
#endif
- 编写主程序main.c
#include<stdlib.h>
#include <stdio.h>
#include "ble.h"
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <option>\n", argv[0]);
return 1;
}
int option = atoi(argv[1]);
switch (option) {
case 1:
check_endian_bitwise();
break;
case 2:
check_endian_pointer();
break;
case 3:
check_endian_bit_field();
break;
case 4:
check_endian_standard();
break;
case 5:
check_endian_union();
break;
default:
printf("Invalid option\n");
break;
}
return 0;
}
- 编译并生成多个可执行文件
执行命令
gcc main.c cebitwise.c cepointer.c cebitfields.c celibrary.c ceunion.c -o main
- Git记录
4、制作静态库
- 新建目录并拷贝代码
mkdir task4 && cd task4
cp ../task3/* .
- 生成目标文件并打包静态库
gcc -c cebitwise.c cebitfields.c celibrary.c cepointer.c ceunion.c
ar rcs libble.a *.o
- 编译主程序并链接静态库
gcc main.c -L. -lble -o main1
- Git记录
git add .
git commit -m "Add static library libble.a"
5、新建目录,拷⻉要求3中代码,制作动态库libble你的八位序号.so,并调用libble.so,编译运行代码,给出运行结果。使用git记录过程
- 新建目录并拷贝代码
mkdir task5 && cd task5
cp ../task3/* .
`
- 将目录所有.c文件转化为.o文件并打包成动态库
gcc -fPIC -c *.c
gcc -shared -o libble20242817.so *.o
- 调用动态库
gcc main.c -L. -lble20242817 -o main
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
- Git记录
git add .
git commit -m "Add dynamic library libble20242817.so"
6、新建目录,按下面目录拷⻉要求3中代码,编写Makefile编译运行代码,给出运行结果。使用git记录过程
- 新建目录并拷贝代码
mkdir task6 && cd task6
cp ../task3/* .
- 编写Makefile
CC = gcc
CFLAGS = -Iinclude
LDFLAGS = -Llib -lble20242817
SRCDIR = src
BINDIR = bin
all: main
main: $(SRCDIR)/main.c
$(CC) $(CFLAGS) -o $(BINDIR)/main $(SRCDIR)/main.c $(LDFLAGS)
clean:
rm -f $(BINDIR)/main
- 创建目录结构如下:
- 编译并运行
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
./bin/main 1
- Git记录
git add .
git commit -m "Add Makefile and directory structure"
7、提交git log结果
git log --oneline
8、AI问答过程
问题:
回答: