解决《UNIX环境高级编程》(APUE)示例代码的编译问题
转自 http://cunsheng.sinaapp.com/?p=360
APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和Mac OS X编译时都遇到了一些小问题, 以下是解决方法和其他一些提示, 希望能对其他人有用
下载了源代码后, 正常情况下两步操作就可以完成编译
- 根据你的操作系统选择对应的Make.defines.*文件, 例如你使用的是Linux, 那么就选择Make.defines.linux, 打开并修改其中的第6行, 将WKDIR的值设为解压出的源码文件夹的绝对路径
- 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大神留下的这一系列好书