2017-2018-1 20155225 《信息安全系統設計基礎》第2周課堂實驗


2017-2018-1 20155225 《信息安全系統設計基礎》第2周課堂實驗

  1. ifndef的用法

作用:防止頭文件被重復包含。最好將頭文件的內容都放在#ifndef和#endif中。格式:

#ifndef <標識x>//測試x是否被宏定義過
#define <標識x>//如果沒有宏定義,就宏定義x並編譯下面的語句
 ......
#endif//如果已經定義了則編譯#endif后面的語句

標識的命名規則一般是頭文件名全大寫,前后加下划線,並把文件名中的“.”也變成下划線。

  1. 在Vi中使用K查找幫助文檔

我們使用vim編輯shell腳本或者c/c++文件時,我們可能需要查找某個命令或者函數的手冊,最簡單的方法是:將光標移動到需要查找幫助的關鍵字上,按下
K

vim會對光標所在的單詞執行"man"程序,找到就顯示,用的是默認分頁程序來處理上下滾動,到達幫助內容底部時按會回到vim.

這是我在vim中使用K查找printf的幫助文檔:

image

  1. 生成並調用靜態庫

ar命令——創建靜態庫.a文件,命令格式如下:

ar rcs  libxxx.a xx1.o xx2.o

參數r:在庫中插入模塊(替換)。當插入的模塊名已經在庫中存在,則替換同名的模塊。如果若干模塊中有一個模塊在庫中不存在,ar顯示一個錯誤消息,並不替換其他同名模塊。默認的情況下,新的成員增加在庫的結尾處,可以使用其他任選項來改變增加的位置。

參數c:創建一個庫。不管庫是否存在,都將創建。

參數s:創建目標文件索引,這在創建較大的庫時能加快時間。(補充:如果不需要創建索引,可改成大寫S參數;如果.a文件缺少索引,可以使用ranlib命令添加)

如圖所示,新產生了mymath.a文件。

image

再編譯、鏈接main.o和mymath.a,生成可執行文件

gcc -static -o 5225 main.o ./mymath.a

如圖所示產生了可執行文件5225(綠色):

image

  1. 生成和調用動態庫
gcc -shared -fpic -o libmymath.so add.c div.c mul.c sub.c

注意:生成靜態庫的時候是將.o文件生成.a文件,動態庫是直接將.c生成.so。

image

再將這個庫鏈接到程序中即可。

gcc -o 5225_2 main.c libmymaht.so

image

5.用顯示規則寫Makefile。

之前不知道什么是makefile,找了幾篇博客學習了一下,有個大概了解吧:

其實上課做實驗的時候就發現了這個問題:程序調試的時候,我發現了main.c寫錯了,然后我改了main.c,再編譯鏈接卻發現運行還是原來main.c的結果,原來我用的是原main.c生成的main.o來鏈接的,於是我只能刪了原main.o重新編譯一個mian.o。當時感覺這個問題很煩人!沒想到有makefile就是幫我解決這個問題的!

makefile的作用就是自動編譯,格式如下:

 target... : prerequisites ...

 command

target也就是一個目標文件,可以是Object File,也可以是執行文件。

prerequisites是生成那個target所需要的文件或是目標。

command也就是make需要執行的命令。(任意的Shell命令)

這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。

對於我們這個程序有五個C文件,一個頭文件。我們要寫一個Makefile來告訴make命令如何編譯和鏈接這幾個文件。我們的規則是:

1.如果這個工程沒有編譯過,那么我們的所有C文件都要編譯並被鏈接。

2.如果這個工程的某幾個C文件被修改,那么我們只編譯被修改的C文件,並鏈接目標程序。

3.如果這個工程的頭文件被改變了,那么我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。

我寫的Makefile如下(還帶有clean命令):

image

對Makefile測試如下:

這是用make命令,第一次編譯,生成了可執行calculator,運行發現是為了固定了a,b的計算器。

image

然后打開main.c修改之后,再用make編譯,發現自動先編譯了main.c,再進行的鏈接。再運行就直接是獲得用戶輸入的計算器了。

image

5.編寫myod.c 用myod XXX實現Linux下od -tx -tc XXX的功能

在linux里od -tx1 -tc XXX 的功能:按指定格式輸出文件內容,-tx1表示以十六進制、一個字節為一組顯示。-tc表示顯示ASCII字符或者反斜杠。效果如圖所示:

image

重新學習了C語言文件處理,但在linux里寫C程序還是稍有不同,首先是文件名通過命令行參數傳過去的,這個怎么弄?參考了Linux 程序設計學習筆記----命令行參數處理 ,解決了這個問題。

寫好程序后,發現文件讀出來是這種樣子???為什么文件后面有一段fffff的亂碼?為什么我設置的16個字節換行,在第二行就不行了?

image

經過我反復調試和修改,發現之所以后面有一段亂碼是因為我設置為16個字符為一次循環,如果最后一行不滿16個就會輸出亂碼,需要在最后設計一個標記,循環到標記處就break。
針對第二行提前換行的情況,我直接分開用兩個循環,解決了這個問題。最終結果如下:

image

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM