解决《UNIX环境高级编程》(APUE)示例代码的编译问题

转自 http://cunsheng.sinaapp.com/?p=360

 

APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和Mac OS X编译时都遇到了一些小问题, 以下是解决方法和其他一些提示, 希望能对其他人有用

下载了源代码后, 正常情况下两步操作就可以完成编译

  1. 根据你的操作系统选择对应的Make.defines.*文件, 例如你使用的是Linux, 那么就选择Make.defines.linux, 打开并修改其中的第6行, 将WKDIR的值设为解压出的源码文件夹的绝对路径
  2. 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大神留下的这一系列好书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值