unix系統我沒安裝,系統不易獲得而且也沒必要安裝unix。用linux是最佳選擇。再者我本來就是ubuntu系統,所以就在ubuntu下搭建環境了。
1,安裝編譯器,為了齊全還是安裝一下build-essential
- sudo apt-get install build-essential
2,下載本書的標頭檔及樣本源碼
點此下載unpv12e.tar.gz(這個編譯有問題)點此下載unpv13e.tar.gz(這個經itnovice回複中告訴我已經解決了錯誤,所以最好用這個,能節省很多時間)
(下載unpv13e的話,3中解決問題的地方就可以略過了)
3,解壓unpv12e.tar.gz後進入目錄查看README,然後可以按照裡面提示操作,不過會遇到問題
第一步:在終端中進入upnv12e目錄,然後執行代碼:
- ./configure
第二步:這裡有問題及解決方案
- cd lib
- make //這一步我出錯了
錯誤碼為:
- gcc -g -O2 -D_REENTRANT -Wall -c -o connect_nonb.o connect_nonb.c
- In file included from connect_nonb.c:1:
- unp.h:114: error: redefinition of ‘struct in_pktinfo’
- make: *** [connect_nonb.o] 錯誤 1
redefinition of ‘structin_pktinfo’的解決方案如下:
結構in_pktinfo已經包含在標準標頭檔bits/in.h中了, 它又通過netinet/in.h 在unp.h中被包括進來. 只要將 unp.h 中的結構定義commentout注釋掉就行了.
注釋掉之後重新
- make //build the basic library that all programs need
這次就成功了!產生了../libunp.a檔案。
第三步:這一步沒有問題
- cd ../libfree # continue building the basic library
- make
第四步:這步解決方案麻煩一點
- cd ../libgai # the getaddrinfo() and getnameinfo() functions
- make
錯誤提示如下:
- gcc -g -O2 -D_REENTRANT -Wall -c -o getaddrinfo.o getaddrinfo.c
- getaddrinfo.c: In function ‘getaddrinfo’:
- getaddrinfo.c:58: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function)
- getaddrinfo.c:58: error: (Each undeclared identifier is reported only once
- getaddrinfo.c:58: error: for each function it appears in.)
- getaddrinfo.c:116: error: ‘EAI_NODATA’ undeclared (first use in this function)
- make: *** [getaddrinfo.o] 錯誤 1
解決方案如下:
回到unpv12e目錄:
- cd ..
- gedit configure.in
找到下面一行注釋掉
LIBGAI_OBJS="getaddrinfo.ogetnameinfo.o freeaddrinfo.ogai_strerror.o"
然後用下面的代碼代替注釋掉的那行
- LIBGAI_OBJS=
- if test "$ac_cv_func_getaddrinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS getaddrinfo.o"
- fi
- if test "$ac_cv_func_getnameinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS getnameinfo.o"
- fi
- if test "$ac_cv_func_freeaddrinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS freeaddrinfo.o"
- fi
- if test "$ac_cv_func_gai_strerror" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS gai_strerror.o"
- fi
- autoconf
- ./configure
- gedit Make.defines
在檔案末尾加上下面這句:
CFLAGS = -g -O2 -D_REENTRANT-Wall -D_GNU_SOURCE
然後重新執行代碼:
[python]
view plaincopy
- cd libgai # continue building the basic library
- make
ok,問題解決了!
4,將產生的libunp.a靜態庫複製到/usr/lib/和/usr/lib64/中。
- cd .. //回到unpv12e目錄
- sudo cp libunp.a /usr/lib
- sudo cp libunp.a /usr/lib64
5,修改unp.h並將其和config.h拷貝到/usr/include中,為了以後include方便
- 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
6,編譯原始碼
- cd ./intro
- gcc daytimetcpcli.c -o daytimetcpcli -lunp
跟普通的編譯不一樣的是要在最後加上剛才那個連結庫,-l參數加上剛才那個libunp.a去掉lib和後面的.a。最後得到參數-lunp。