转自 http://cunsheng.sinaapp.com/?p=360
APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和Mac OS X编译时都遇到了一些小问题, 以下是解决方法和其他一些提示, 希望能对其他人有用
下载了源代码后, 正常情况下两步操作就可以完成编译
编译时可能会出现不少warning, 但只要能一直执行到最后就算是成功, 可以echo $?看看, 如果输出0就表示成功
我的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
'
|
我的版本是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))
|
在实践APUE示例源码时用gdb配合当然是最好不过了, 不过你需要在cc时加上-g选项才能输出gdb调试时所需的symbols
打开你的操作系统对应的Make.defines.*文件, 在第7行的加上-g选项就OK了
最后提醒下, 源码的章节编号是按照英文版来的, 例如我的APUE第二版第4页的程序清单1-1, 理应对应的源码是fig1.1, 但实际却是fig1.3, 找代码时要人脑offset一下才是
最最后, 感谢已故的Richard Stevens大神留下的这一系列好书