http://jimslinbing.blog.163.com/blog/static/85054319201292712414518/
1.到http://www.apuebook.com下載源碼
2.tar解包,cd apue.2e
3.vi Make.defines.linux 修改變量WKDIR,指向你的apue源碼的位置,我的是/home/huangz/code/apue.2e,所以
WKDIR=/home/huangz/code/apue.2e
4.vi include/apue.h 增加一個常量ARG_MAX,這是threadctl/getenv1.c和threadctl/getenv3.c要用到的;4096這個值是參考里給的,如果有問題,自己修改吧。
#define ARG_MAX 4096
5.vi threadctl/getenv1.c 增加
#include "apue.h"
6.vi threadctl/getenv3.c 增加
#include "apue.h"
7.vi threads/badexit2.c 修改第31行,將pthread_self()的返回值轉換為int類型。
printf("thread 2: ID is %d\n", (int)pthread_self());
8.vi std/linux.mk 將兩個nawk改為awk,如果是用的vi/vim編輯器,可以使用這個命令:$s/nawk/awk/g
9.apue.h頭文件的#endif前面添加一行 #include "error.c"
10.make
11.sudo cp include/apue.h /usr/include
sudo cp apue.2e/lib/error.c /usr/include
sudo cp lib/libapue.a /usr/lib
好了,測試一下,記得要用-lapue命令讓編譯器鏈接libapue.a庫
gcc main.c -lapue
cc -o threadid threadid.c -lapue -lpthread
編譯過程出現錯誤:
In file included from /usr/include/i386-linux-gnu/bits/time.h:86:0,
from /usr/include/time.h:42,
from /usr/include/pthread.h:26,
from printd.c:11:
/usr/include/i386-linux-gnu/bits/timex.h:31:7: 錯誤: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘.’ token
這是linux的time.h中定義林全局變量status,在apue.h/ipp的ipp.h中也定義了,改成Status,
編譯出錯的時候將相應位置的status改成Status即可,
再把apue.h/ipp/printd.c中的hp->status 改成hp->Status即可。
總結:下載了apue.h以后,將apue.h放到/usr/include/下,在/apue.2e/lib/error.c,
將error.c復制到/usr/include/下,在apue.h的最后一行 #endif前 加一句#include"error.c ",即可。但是不保證能全部執行書上代碼。