转自 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大神留下的这一系列好书

解决《UNIX环境高级编程》(APUE)示例代码的编译问题的更多相关文章

  1. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...

随机推荐

  1. Nginx 响应状态

    ngx.status = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release)ngx.status = ngx.HTTP_SWITC ...

  2. BZOJ2287【POJ Challenge】消失之物

    题解: 1.以前见过类似的,可以cdq分治 当l=r时就是还有一个剩余 这样时间是nmlogn的 空间是mlogn 2.首先我们可以dp出表示出j的方案数 令g[i][j]表示不能选i,表示出j的方案 ...

  3. springmvc中登录过滤器使用

      前言 一般的javaWeb项目中我们肯定会使用过滤器来实现对一些请求的过滤,通过过滤来实现对一些请求参数的设置和校验,比如我们比较熟悉的CharacterEncodingFilter就是一个字符编 ...

  4. 010.Docker Compose构建WordPress实战

    一 前期规划 类型 版本 备注 WordPress镜像 wordpress:latest   MySQL数据库 5.7   Docker已安装,参考<002.Docker版本及安装>. D ...

  5. DB2<RedHed Linux> 创建数据库

    1 DB2 安装后组情况 Users User Desc Username Home folder Password Group   Administration User -dasusr1 /hom ...

  6. Topcoder SRM590 Fox And City

    Problem Statement      There is a country with n cities, numbered 0 through n-1. City 0 is the capit ...

  7. 洛谷.U19464.山村游行wander(LCT 伪期望)

    题目链接 题意: 森林,动态建边.删边,询问从S开始走到T的期望时间.走位: 每次人会随机地选一条未走过的边走,走到无路可走,再退回.这样直到终点T.走一条边.从一条边退回都花费时间1. 题目特点是走 ...

  8. centos6.9 忘记密码解决方法

    若果忘记了 root 的密码,解决方法如下: 我采用的 linux 版本是 centos-6.9 , 经过亲身实践证明,该方法是 ok 的 在开机启动的时候按键盘上的“E”键会进入如下界面. 选择相应 ...

  9. CocosCreator项目结构

    1,通过 Dashboard,我们可以创建一个 Hello World 项目作为开始,创建之后的项目有特定的文件夹结构.[参考来源:官方文档] 2,初次创建并打开一个 Cocos Creator 项目 ...

  10. PHP错误:Namespace declaration statement has to be the very first statement in the script

    PHP错误:Namespace declaration statement has to be the very first statement in the script 原因:意思就是“names ...