解決《UNIX環境高級編程》(APUE)示例代碼的編譯問題


轉自 http://cunsheng.sinaapp.com/?p=360

 

APUE中示例很多, 把這些源碼拿來跑跑調調對學習理解有着莫大的幫助, 隨書網站就提供了源碼下載, 不過我自己在Linux和Mac OS X編譯時都遇到了一些小問題, 以下是解決方法和其他一些提示, 希望能對其他人有用

下載了源代碼后, 正常情況下兩步操作就可以完成編譯

  1. 根據你的操作系統選擇對應的Make.defines.*文件, 例如你使用的是Linux, 那么就選擇Make.defines.linux, 打開並修改其中的第6行, 將WKDIR的值設為解壓出的源碼文件夾的絕對路徑
  2. 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大神留下的這一系列好書


免責聲明!

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



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