Stevens的《UNIX網路編程 卷1:通訊端連網API》是一本很著名的UNIX網路編程書籍。其中使用了一個unp.h的引用,如果沒有設定相應的庫的話,即使引入了標頭檔也是沒用的。所以首先要配置相應的庫。
基礎環境:
作業系統 Debian
開發環境 GCC,MAKE等,首先要有c編譯器,make等基礎的工具。如果沒有的話,可以通過下面命令安裝。這個命令會安裝一個工具集,其中包含了很多linux C開發所需的工具。
sudo apt-get install build-essential
(1)從網上下載unpv.13e.tar.gz。在網上一搜一大堆。unpv.12e.tar.gz版本的有問題,所以要避免使用。下載了安裝包解壓後就可以照著他的README檔案指示安裝了。解壓的命令是
tar -xvf unpv.13e.tar.gz
(2)現在可以cd到unpv13e目錄。執行下面兩個命令就可以在unpv13e目錄下產生相應的庫函數。
cd unpv13e./configurecd lib && make
(3)返回unpv13e目錄,將產生的libunp.a複製到相應的庫檔案目錄下。相應的shell命令。
cd ..sudo cp libunp.a /usr/lib sudo cp libunp.a /usr/lib64
(4)修改unp.h並將其和config.h拷貝到/usr/iinclude中
gedit lib/unp.h //將unp.h中#include "../config.h"修改為#include "config.h"
sudo cp lib/unp.h /usr/include sudo cp config.h /usr/include
(5)編寫一個小程式測試一下吧,在unpv13e的intro目錄中包含了幾個執行個體。可以用來測試一下。看能否產生相應的可執行檔。
cd ./intro gcc daytimetcpcli.c -o daytimetcpcli -lunp
附錄:Linux中的庫
庫是作為軟體的一個組建存在的,其目的是提高軟體的可重用性。庫裡面封裝了資料和函數。庫可以分為靜態庫和動態庫兩種。在Linux系統中,通常把庫檔案放在/usr/lib或/lib目錄中。Linux庫檔案名稱由首碼lib、庫名以及尾碼組成,其中動態庫的尾碼為.so,而靜態庫的尾碼為.a。
在程式中使用靜態庫和動態庫時,他們載入的順序是不一樣的。靜態庫的代碼在編譯是就拷貝到應用程式中,因此當多個應用程式同時引用一個靜態庫函數時,記憶體會有調用函數的多個副本。,這樣的優點是可以節約編譯是的時間。而動態庫是在程式開始運行後調用庫函數是才被載入的,被調函數在記憶體中只有一個副本,並且動態庫是可以在程式運行期間釋放動態庫所佔記憶體的。
(1)靜態庫的建立和使用
建立靜態庫的步驟如下:
1)在一個標頭檔中聲明靜態庫所匯出的函數。
2)在一個源檔案中實現靜態庫函數所匯出的函數。
3)編譯源檔案,產生可執行代碼。
4)將可執行代碼所在的目標檔案加入到某個靜態庫中,並在靜態庫拷貝到系統預設的存放庫檔案的目錄下。
編譯並添加靜態庫
gcc -o mylib.o -c mylib.car rcs libmylib.a mylib.o
ar命令可以建立和修改靜態庫。具體參見:man ar
(2)動態庫的建立和使用
上面的配置過程建立的就是一個動態庫。在編譯包含動態庫的函數是可以使用“-lunp”(包含上面所編譯的庫檔案)選項。程式將調用動態連結程式庫libunp.so中的函數。在-lunp中,-l為選項,unp為庫名。unp是“libunp.so”的中間部分,linux中所以的庫都以lib開始,在編譯器時無需帶上首碼和尾碼。
編譯並添加動態庫
gcc -fPIC -o mylib.o -c mylib.cgcc -shared -o libmylib.so mylib.o
或
gcc -fPIC -shared -o libmylib.so mylib.c
參考:unix網路環境搭配
UNIX網路編程之旅-配置unp.h標頭檔環境[ 轉]
LInux C 實戰編程