轉自 http://cunsheng.sinaapp.com/?p=360
APUE中示例很多, 把這些源碼拿來跑跑調調對學習理解有着莫大的幫助, 隨書網站就提供了源碼下載, 不過我自己在Linux和Mac OS X編譯時都遇到了一些小問題, 以下是解決方法和其他一些提示, 希望能對其他人有用
下載了源代碼后, 正常情況下兩步操作就可以完成編譯
- 根據你的操作系統選擇對應的Make.defines.*文件, 例如你使用的是Linux, 那么就選擇Make.defines.linux, 打開並修改其中的第6行, 將WKDIR的值設為解壓出的源碼文件夾的絕對路徑
- make
編譯時可能會出現不少warning, 但只要能一直執行到最后就算是成功, 可以echo $?看看, 如果輸出0就表示成功
Linux下的編譯問題
我的Linux發行版是CentOS release 5.4 (Final), make時報如下錯誤
|
1
2
3
4
5
|
make
[2]: Entering directory `
/home/cunsheng/code/apue
.2e
/std
'
nawk -f makeconf.
awk
>conf.c
/bin/sh
: nawk:
command
not found
make
[2]: *** [conf.c] Error 127
make
[2]: Leaving directory `
/home/cunsheng/code/apue
.2e
/std
'
|
提示nawk不存在, 關於nawk與awk的異同可見這里, 解決這個問題可以簡單的用awk替代nawk來解決, 可以挑PATH中的任一可尋路徑(例如~/bin) ln -s建立個nawk的軟鏈到awk, 然后一定記得make clean后再make, 否則你會遇到下面的這個問題
|
1
2
3
4
5
6
7
|
make
[2]: Entering directory `
/home/cunsheng/code/apue
.2e
/std
'
gcc -DLINUX -ansi -I
/home/cunsheng/code/apue
.2e
/include
-Wall -D_GNU_SOURCE -L..
/lib
conf.c ..
/lib/libapue
.a -o conf
/usr/lib/
..
/lib64/crt1
.o: In
function
`_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1
exit
status
make
[2]: *** [conf] Error 1
make
[2]: Leaving directory `
/home/cunsheng/code/apue
.2e
/std
'
|
OS X下的編譯問題
我的版本是10.8.1, Xcode版本是4.4.1, make時報如下錯誤
|
1
2
3
4
5
6
|
gcc -ansi -I
/Volumes/Cunsheng/Home/Code/apue
.2e
/include
-Wall -DMACOS -DDEBUG -o call main.o call.o put.o take.o takeput.o escape.o loop.poll.o ..
/sockets/clconn
.o ..
/lib/libapue
.a
Undefined symbols
for
architecture x86_64:
"_CMSG_LEN"
, referenced from:
_recv_fd
in
libapue.a(recvfd.o)
ld: symbol(s) not found
for
architecture x86_64
collect2: ld returned 1
exit
status
|
造成這個問題的原因, 從表面看是”CMSG_LEN”宏缺少了對OS X的定義, 但我猜測可能這背后還有故事, 這里就不細究了, 解決方法也很簡單, 打開include/apue.h, 在第8行往后插入以下兩行代碼后再make clean; make即可
|
1
2
|
#elif defined(MACOS)
#define CMSG_LEN(x) _CMSG_DATA_ALIGN(sizeof(struct cmsghdr)+(x))
|
關於GDB
在實踐APUE示例源碼時用gdb配合當然是最好不過了, 不過你需要在cc時加上-g選項才能輸出gdb調試時所需的symbols
打開你的操作系統對應的Make.defines.*文件, 在第7行的加上-g選項就OK了
最后提醒下, 源碼的章節編號是按照英文版來的, 例如我的APUE第二版第4頁的程序清單1-1, 理應對應的源碼是fig1.1, 但實際卻是fig1.3, 找代碼時要人腦offset一下才是
最最后, 感謝已故的Richard Stevens大神留下的這一系列好書
