以下是APUE第二版和第一版源碼的編繹和執行過程:
1. Advanced Programming in the UNIX® Environment: Second Edition (APUE第二版)
a. 進入APUE網站下載Source code: src.tar.tar。
b. 當前壓縮包路徑/APUEDIR/,解壓並進入源碼目錄apue.2e。
$ ls src.tar.tar $ tar -zxvf src.tar.tar ... $ ls apue.2e src.tar.tar $ cd apue.2e/
c. 瞭解並獲取當前系統支持的Makefile類型:Make.defines.freebsd,Make.defines.linux,Make.defines.macos,Make.defines.solaris其中之一。
$ sh systype.sh (查看系統類型) linux $ vi Make.defines.linux (編輯相應的Makefile文件,設置當前工作目錄) #WKDIR=/home/sar/apue.2e WKDIR=/APUEDIR/apue.2e #更改爲當前源碼目錄 (保存退出)
d. 編繹
d.1. 若想一次編繹所有文件
$ cd /APUEDIR/apue.2e/ $ make (編繹出錯,找不到nawk命令) ... nawk -f makeconf.awk >conf.c /bin/sh: line 1: nawk: command not found make[2]: *** [conf.c] Error 127 ... $ 修改std/linux.mk,將nawk更改爲awk或gawk,或執行ln -s /bin/gawk $HOME/bin/nawk,生成一個nawk $ make clean (消除之前的編繹過程記錄) $ make (重新編繹) (會出現一些warning信息,無妨)
d.2. 若只想單獨測試某個程序,如advio/mcopy.c,此程序用於拷貝文件,並生成文件副本:
$ cd /APUEDIR/apue.2e/advio/ $ cp linux.mk Makefile (建立當前工作目錄下的Makefile文件,作者已在所有目錄下放置了四個.mk文件,分別對應四個系統) $ make clean (清除當前工作目錄下已經編繹過的可執行文件及目標文件) $ make mcopy (編繹指定的單個程序,無後綴) gcc -DLINUX -ansi -I/APUEDIR/apue.2e/include -Wall -D_GNU_SOURCE -L../lib mcopy.c ../lib/libapue.a -o mcopy $ ./mcopy (非法執行,無參數) usage: ./mcopy $ ./mcopy linux.mk linux.mk.bak (正確執行,拷貝linux.mk,生成文件副本linux.mk.bak) $ ls Makefile catgetmsg.c devzero.c freebsd.mk linux.mk linux.mk.bak macos.mk mcopy mcopy.c nonblockw.c pendlock.c solaris.mk
2. Advanced Programming in the Unix Environment (APUE第一版)
a. 主站似乎已經無法匿名登錄。
b. 當前壓縮包路徑/APUEDIR/,解壓並進入源碼目錄/APUEDIR/apue/。
$ ls stevens.advprog.tar.Z $ tar -zxvf stevens.advprog.tar.Z $ ls apue stevens.advprog.tar.Z $ cd apue/
c. 瞭解並獲取當前系統支持的Makefile類型:Make.def.44,Make.def.sun,Make.def.svr4其中之一。
$ cd lib.sun/ 或 $ cd lib.44/ 或 $ cd lib.svr4/,進入任一目錄,這些目錄其中之一即系統編繹目錄,也是生成庫文件libmisc.a的目錄 $ sh systype.sh (查看最接近的當前系統類型,作者似乎對三個目錄的systype.sh文件作了硬連接,修改其中任何一個,都會使其它目錄的這個文件也作相應變化) svr4 $ cd .. (進入上層目錄,即apue/) $ cp Make.def.svr4 Make.defines $ vi Make.defines (設置庫文件libmisc.a地址) ... #LDFLAGS=/home/stevens/libmisc.a LDFLAGS=/APUEDIR/apue/libmisc.a ... #LIB = /home/stevens/libmisc.a LIB = /APUEDIR/apue/libmisc.a ... (保存退出) $ cd lib.svr4/ (進入主編繹目錄,即apue/lib.svr4/) $ vi Makefile #make `systype.sh` make `/bin/bash systype.sh` (添加執行路徑,否則程序無反應導致make失敗) (保存退出)
d. 編繹
$ cd /APUEDIR/apue/lib.svr4/ (進入主編繹目錄) $ make (make失敗,重複定義) ... strerror.c:3: conflicting types for 'sys_errlist' /usr/include/bits/sys_errlist.h:28: previous declaration of 'sys_errlist' make[2]: *** [strerror.o] Error 1 ... $ vi strerror.c (修改當前目錄下的錯誤處理文件) //extern char *sys_errlist[]; //extern int sys_nerr; (將這兩行註釋掉,/usr/include/bits/sys_errlist.h中已有聲明,如今這個文件已不推薦使用,但仍然被包含在/usr/include/stdio.h文件中) (保存退出)
e. 生成後期程序編繹需要依賴的庫文件libmisc.a
$ cd /APUEDIR/apue/lib.svr4/ $ make clean (清除已編繹記錄) rm -f *.o a.out core temp.* $ make (重新編繹) $ cd .. (編繹完成,返回上層目錄,即apue/) $ ls (已生成一個庫文件libmisc.a,所有的程序都需要依賴這個文件進行編繹) ... libmisc.a ...
f. 開始測試某個程序,如advio/mcopy.c,此程序用於拷貝文件,並生成文件副本:
$ cd /APUEDIR/apue/advio/ $ make clean (清除當前工作目錄下已經編繹過的可執行文件及目標文件) $ make mcopy (編繹指定的單個程序,無後綴) cc /home/zhangfeng/apue/oldapue/apue/libmisc.a mcopy.c /home/zhangfeng/apue/oldapue/apue/libmisc.a -o mcopy /home/zhangfeng/apue/oldapue/apue/libmisc.a(strerror.o): In function 'strerror': strerror.o(.text+0x18): 'sys_errlist' is deprecated; use 'strerror' or 'strerror_r' instead strerror.o(.text+0xf): 'sys_nerr' is deprecated; use 'strerror' or 'strerror_r' instead (暫時忽略警告信息) $ ./mcopy (非法執行,無參數) usage: a.out $ ./mcopy Makefile Makefile.bak (正確執行,拷貝Makefile,生成文件副本Makefile.bak) $ ls Makefile Makefile.bak catgetmsg.c devzero.c mcopy mcopy.c nonblockw.c ourhdr.h pollpipe.c selectpipe.c