Unix網絡編程第三版源碼編譯

本文用的Unix網絡編程源碼是第三版,不同版本的源碼可能會有不同的錯誤,還有不同的操作系統也會有不同的錯誤,本文基於fedora 20 64位操作系統,不過一般都不是滿大的問題,多改兩下就好了。

配置:

cd Unix-Network-Programming/
./configure      //若無法執行,可以用chmod更改權限
主要的工作是檢查系統是否有源碼編譯所依賴的各種資源(系統版本是否匹配、編譯器、庫文件、頭文件以及結構體定義等等)

編譯庫:

編譯所有例程都需要用到的基礎庫

cd lib
make

得到靜態庫文件:libudp.a


繼續編譯基本庫
$ cd ../libfree/
$ make

gcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o in_cksum.o in_cksum.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o inet_ntop.o inet_ntop.c
inet_ntop.c: In function ‘inet_ntop’:
inet_ntop.c:60:9: error: argument ‘size’ doesn’t match prototype
  size_t size;
         ^
In file included from inet_ntop.c:27:0:
/usr/include/arpa/inet.h:64:20: error: prototype declaration
 extern const char *inet_ntop (int __af, const void *__restrict __cp,
                    ^
make: *** [inet_ntop.o] Error 1


出現錯誤!仔細查看發是在 inet_ntop方法中的參數size的類型,與聲明在 /usr/include/arpa/inet.h中的inet_ntop()中的size參數類型不一致導致
使用 vim /usr/include/arpa/inet.h 命令查看inet_ntop函數的聲明,發現其size的類型爲socklen_t,所以將原size類型改爲socklen_t就可以了,然後還要修改inet_ntop4()和inet_ntop()6函數的參數類型,然後就大功告成。

再次編譯
$ make
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_ntop.o inet_ntop.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_pton.o inet_pton.c
ar rv ../libunp.a in_cksum.o inet_ntop.o inet_pton.o
a - in_cksum.o
a - inet_ntop.o
a - inet_pton.o
ranlib ../libunp.a

貌似這次編譯的內容併到了libunp.a中,沒有生成新的庫文件。


$ cd ../libgai
$ make
ar rv ../libunp.a
ranlib ../libunp.a


拷貝生成的庫文件到系統庫目錄
$ cd ..
$ sudo cp libunp.a /usr/lib
$ sudo cp libunp.a /usr/lib32

將unp.h中  #include "../config.h" 修改爲#include "config.h"並將其和config.h拷貝到/usr/include中

然後編譯源代碼
cd ./intro 

gcc daytimetcpcli.c -o daytimetcpcli -lunp 
跟普通的編譯不一樣的是要在最後加上剛纔那個鏈接庫,-l參數加上剛纔那個libunp.a去掉lib和後面的.a。最後得到參數-lunp。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章