APUE源碼編繹及執行

以下是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更改爲awkgawk,或執行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
發佈了23 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章