20231302-邱之釗-C編程工具測(cè)試
你好,20231302 邱之釗!很高興看到你正在學(xué)習(xí)Linux C編程,這對(duì)你未來(lái)在國(guó)產(chǎn)化操作系統(tǒng)上的就業(yè)非常有幫助。我會(huì)根據(jù)你的中等基礎(chǔ),詳細(xì)講解每個(gè)步驟,幫助你更好地理解和掌握這些知識(shí)。讓我們一起努力,逐步完成這些任務(wù)!
完成下面任務(wù)(29 分
首先,我推薦你使用 openEuler 系統(tǒng)來(lái)完成這些任務(wù),因?yàn)樗N近你未來(lái)的就業(yè)環(huán)境。我會(huì)從基礎(chǔ)開(kāi)始,一步步引導(dǎo)你,確保你能跟上。
任務(wù)1:編寫(xiě) hello.c 并編譯運(yùn)行
在這個(gè)任務(wù)中,你需要編寫(xiě)一個(gè)簡(jiǎn)單的C程序,打印出你的學(xué)號(hào)和名字,然后使用gcc命令完成編譯預(yù)處理、編譯、匯編和鏈接的過(guò)程,并用git記錄。關(guān)鍵步驟包括:編寫(xiě)代碼、使用gcc分步編譯、運(yùn)行程序并驗(yàn)證輸出,以及使用git進(jìn)行版本控制。這對(duì)于理解C程序的編譯過(guò)程非常重要。
先創(chuàng)建一個(gè)目錄來(lái)存放你的項(xiàng)目文件:
mkdir -p ~/project1
cd ~/project1
編寫(xiě) hello.c 文件:
#include <stdio.h>
int main() {
printf("hello 20231302 邱之釗");
return 0;
}
現(xiàn)在,使用gcc命令分步編譯:
預(yù)處理:gcc -E hello.c -o hello.i – 這會(huì)處理頭文件和宏,生成預(yù)處理后的文件 hello.i。
編譯:gcc -S hello.i -o hello.s – 將預(yù)處理后的代碼編譯成匯編代碼 hello.s。
匯編:gcc -c hello.s -o hello.o – 將匯編代碼轉(zhuǎn)換成目標(biāo)文件 hello.o。
鏈接:gcc hello.o -o hello – 將目標(biāo)文件鏈接成可執(zhí)行文件 hello。
運(yùn)行程序:./hello,輸出應(yīng)該是 "hello 20231302 邱之釗"。
使用git記錄過(guò)程:
git init
git add hello.c hello.i hello.s hello.o hello
git commit -m "添加hello.c和編譯過(guò)程文件"
這個(gè)任務(wù)幫助你理解C程序從源代碼到可執(zhí)行文件的完整流程,這是編程基礎(chǔ)中的核心知識(shí)。


任務(wù)2:判斷電腦是大端還是小端
在這個(gè)任務(wù)中,你需要編寫(xiě)至少兩個(gè)函數(shù)來(lái)判斷電腦的字節(jié)序(大端或小端),并在main函數(shù)中調(diào)用它們。字節(jié)序指的是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)順序,大端是高位字節(jié)在前,小端是低位字節(jié)在前。這在網(wǎng)絡(luò)編程和底層開(kāi)發(fā)中很常見(jiàn)。
先創(chuàng)建一個(gè)新目錄:
mkdir -p ~/project2
cd ~/project2
編寫(xiě)一個(gè)頭文件 endian.h:
#ifndef ENDIAN_H
#define ENDIAN_H
int is_big_endian();
int is_little_endian();
#endif
編寫(xiě)源文件 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);
}
編寫(xiě) 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;
}
編譯和運(yùn)行:
gcc -c endian.c -o endian.o
gcc main.c endian.o -o main
./main
輸出會(huì)告訴你電腦的字節(jié)序。這個(gè)任務(wù)讓你實(shí)踐函數(shù)模塊化和調(diào)用,同時(shí)學(xué)習(xí)底層內(nèi)存知識(shí)。


任務(wù)3:制作和使用靜態(tài)庫(kù)與共享庫(kù)
現(xiàn)在,你將把上面的代碼制作成靜態(tài)庫(kù)和共享庫(kù)。靜態(tài)庫(kù)在編譯時(shí)鏈接到程序中,而共享庫(kù)在運(yùn)行時(shí)動(dòng)態(tài)加載,這提高了代碼的復(fù)用性和可維護(hù)性。
首先,創(chuàng)建靜態(tài)庫(kù):
ar rcs libendian.a endian.o
使用靜態(tài)庫(kù)編譯:
gcc main.c -L. -lendian -o main_static
創(chuàng)建共享庫(kù):
gcc -shared -fPIC endian.c -o libendian.so
使用共享庫(kù)編譯:
gcc main.c -L. -lendian -o main_shared
運(yùn)行前,設(shè)置庫(kù)路徑:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main_shared
制作和使用庫(kù)是大型項(xiàng)目中的常見(jiàn)實(shí)踐,能減少代碼冗余并提高效率。

任務(wù)4:按指定結(jié)構(gòu)組織代碼并編譯
在這個(gè)任務(wù)中,你需要將代碼按bin、include、lib、src目錄組織,然后編譯和使用庫(kù)。這模擬了真實(shí)項(xiàng)目的結(jié)構(gòu),有助于你學(xué)習(xí)項(xiàng)目管理和構(gòu)建流程。
創(chuàng)建目錄結(jié)構(gòu):
mkdir -p project4/{bin,include,lib,src}
移動(dòng)文件:
將 endian.h 放到 include/
將 endian.c 和 main.c 放到 src/
編譯后,可執(zhí)行文件放到 bin/,庫(kù)文件放到 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
運(yùn)行:
cd ../bin
export LD_LIBRARY_PATH=../lib:$LD_LIBRARY_PATH
./main
這個(gè)任務(wù)強(qiáng)化了目錄結(jié)構(gòu)和構(gòu)建命令的使用,為你未來(lái)的項(xiàng)目開(kāi)發(fā)打下基礎(chǔ)。

任務(wù)5:補(bǔ)充Makefile
最后,你需要為項(xiàng)目編寫(xiě)一個(gè)簡(jiǎn)單的Makefile。Makefile自動(dòng)化了編譯過(guò)程,提高了開(kāi)發(fā)效率,是Linux編程中不可或缺的工具。
在項(xiàng)目根目錄創(chuàng)建 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
通過(guò)學(xué)習(xí)Makefile,你能更好地管理復(fù)雜項(xiàng)目的構(gòu)建過(guò)程。

20231302 邱之釗,這些任務(wù)涵蓋了C編程的基礎(chǔ)到進(jìn)階知識(shí),包括編譯過(guò)程、模塊化、庫(kù)的使用和項(xiàng)目結(jié)構(gòu)。我鼓勵(lì)你動(dòng)手實(shí)踐,每一步都自己嘗試一遍。如果有問(wèn)題,隨時(shí)問(wèn)我!堅(jiān)持練習(xí),你會(huì)逐步掌握這些技能,為未來(lái)的職業(yè)生涯做好準(zhǔn)備。加油!
作業(yè)提交要求 (1')
拷貝出AI生成的所有內(nèi)容,把你實(shí)踐編譯和測(cè)試過(guò)程截圖插入,AI生成內(nèi)容不滿意,可以刷新一下,代碼可能不能直接使用,需要你做簡(jiǎn)單修改
(選做)推薦所有作業(yè)托管到 gitee或 github 上
(必做)提交作業(yè) markdown文檔,命名為“學(xué)號(hào)-姓名-作業(yè)題目.md”
(必做)提交作業(yè) markdown文檔轉(zhuǎn)成的 PDF 文件,命名為“學(xué)號(hào)-姓名-作業(yè)題目.pdf”
浙公網(wǎng)安備 33010602011771號(hào)