你好,20231302 邱之钊!很高兴看到你正在学习Linux C编程,这对你未来在国产化操作系统上的就业非常有帮助。我会根据你的中等基础,详细讲解每个步骤,帮助你更好地理解和掌握这些知识。让我们一起努力,逐步完成这些任务!
完成下面任务(29 分
首先,我推荐你使用 openEuler 系统来完成这些任务,因为它更贴近你未来的就业环境。我会从基础开始,一步步引导你,确保你能跟上。
任务1:编写 hello.c 并编译运行
在这个任务中,你需要编写一个简单的C程序,打印出你的学号和名字,然后使用gcc命令完成编译预处理、编译、汇编和链接的过程,并用git记录。关键步骤包括:编写代码、使用gcc分步编译、运行程序并验证输出,以及使用git进行版本控制。这对于理解C程序的编译过程非常重要。
先创建一个目录来存放你的项目文件:
mkdir -p ~/project1
cd ~/project1
编写 hello.c 文件:
include <stdio.h>
int main() {
printf("hello 20231302 邱之钊
");
return 0;
}
现在,使用gcc命令分步编译:
预处理:gcc -E hello.c -o hello.i – 这会处理头文件和宏,生成预处理后的文件 hello.i。
编译:gcc -S hello.i -o hello.s – 将预处理后的代码编译成汇编代码 hello.s。
汇编:gcc -c hello.s -o hello.o – 将汇编代码转换成目标文件 hello.o。
链接:gcc hello.o -o hello – 将目标文件链接成可执行文件 hello。
运行程序:./hello,输出应该是 "hello 20231302 邱之钊"。
使用git记录过程:
git init
git add hello.c hello.i hello.s hello.o hello
git commit -m "添加hello.c和编译过程文件"
这个任务帮助你理解C程序从源代码到可执行文件的完整流程,这是编程基础中的核心知识。
任务2:判断电脑是大端还是小端
在这个任务中,你需要编写至少两个函数来判断电脑的字节序(大端或小端),并在main函数中调用它们。字节序指的是数据在内存中的存储顺序,大端是高位字节在前,小端是低位字节在前。这在网络编程和底层开发中很常见。
先创建一个新目录:
mkdir -p ~/project2
cd ~/project2
编写一个头文件 endian.h:
ifndef ENDIAN_H
define ENDIAN_H
int is_big_endian();
int is_little_endian();
endif
编写源文件 endian.c:
include "endian.h"
int is_big_endian() {
unsigned int num = 0x1;
char *byte = (char *)#
return (byte[0] == 0);
}
int is_little_endian() {
unsigned int num = 0x1;
char *byte = (char *)#
return (byte[0] == 1);
}
编写 main.c:
include <stdio.h>
include "endian.h"
int main() {
if (is_big_endian()) {
printf("This computer is big endian.
");
} else if (is_little_endian()) {
printf("This computer is little endian.
");
} else {
printf("Unknown endianness.
");
}
return 0;
}
编译和运行:
gcc -c endian.c -o endian.o
gcc main.c endian.o -o main
./main
输出会告诉你电脑的字节序。这个任务让你实践函数模块化和调用,同时学习底层内存知识。
任务3:制作和使用静态库与共享库
现在,你将把上面的代码制作成静态库和共享库。静态库在编译时链接到程序中,而共享库在运行时动态加载,这提高了代码的复用性和可维护性。
首先,创建静态库:
ar rcs libendian.a endian.o
使用静态库编译:
gcc main.c -L. -lendian -o main_static
创建共享库:
gcc -shared -fPIC endian.c -o libendian.so
使用共享库编译:
gcc main.c -L. -lendian -o main_shared
运行前,设置库路径:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main_shared
制作和使用库是大型项目中的常见实践,能减少代码冗余并提高效率。
任务4:按指定结构组织代码并编译
在这个任务中,你需要将代码按bin、include、lib、src目录组织,然后编译和使用库。这模拟了真实项目的结构,有助于你学习项目管理和构建流程。
创建目录结构:
mkdir -p project4/{bin,include,lib,src}
移动文件:
将 endian.h 放到 include/
将 endian.c 和 main.c 放到 src/
编译后,可执行文件放到 bin/,库文件放到 lib/
编译步骤:
cd src
gcc -c endian.c -o ../lib/endian.o
ar rcs ../lib/libendian.a ../lib/endian.o
gcc -shared -fPIC endian.c -o ../lib/libendian.so
gcc main.c -I../include -L../lib -lendian -o ../bin/main
运行:
cd ../bin
export LD_LIBRARY_PATH=../lib:$LD_LIBRARY_PATH
./main
这个任务强化了目录结构和构建命令的使用,为你未来的项目开发打下基础。
任务5:补充Makefile
最后,你需要为项目编写一个简单的Makefile。Makefile自动化了编译过程,提高了开发效率,是Linux编程中不可或缺的工具。
在项目根目录创建 Makefile:
main: src/main.c src/endian.c include/endian.h
gcc -Iinclude src/main.c src/endian.c -o bin/main
clean:
rm -f bin/main
使用make编译:
make
make clean
通过学习Makefile,你能更好地管理复杂项目的构建过程。
20231302 邱之钊,这些任务涵盖了C编程的基础到进阶知识,包括编译过程、模块化、库的使用和项目结构。我鼓励你动手实践,每一步都自己尝试一遍。如果有问题,随时问我!坚持练习,你会逐步掌握这些技能,为未来的职业生涯做好准备。加油!
作业提交要求 (1')
拷贝出AI生成的所有内容,把你实践编译和测试过程截图插入,AI生成内容不满意,可以刷新一下,代码可能不能直接使用,需要你做简单修改
(选做)推荐所有作业托管到 gitee或 github 上
(必做)提交作业 markdown文档,命名为“学号-姓名-作业题目.md”
(必做)提交作业 markdown文档转成的 PDF 文件,命名为“学号-姓名-作业题目.pdf”