解决《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大神留下的这一系列好书
解决《UNIX环境高级编程》(APUE)示例代码的编译问题的更多相关文章
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (八) 一起学 Unix 环境高级编程 (APUE) 之 信号
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (九) 一起学 Unix 环境高级编程 (APUE) 之 线程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...
随机推荐
- 在django中,redirect如何传递message。
众所周知,在django中,默认的message,只能在同一个request中传递. 但如果在请求过程中,使用了redirect跳转,那么,这个一次性的message就会失败, 无法在前端给用户提示. ...
- mydate97时间控件的使用
mydate97官网: http://www.my97.net/dp/index.asp 1:用法如下所示,首先下载一个这个东西: 链接:http://pan.baidu.com/s/1kVmIckv ...
- URAL - 1427-SMS
题目大意:给你长度为n的字符串(n<=1e6),让你对它进行划分,如果一段里面只有字母和 空格可以包含m(m<=1e5)个,如果有其他字符只能包含n个,问你最少需要分成几段. 思路:划分d ...
- Python进行URL解码
import urllib rawurl=xxx url=urllib.unquote(rawurl) 所用模块:urllib 所用函数:urllib.unquote() 案例 import urll ...
- Ajax提交form表单内容和文件(jQuery.form.js)
jQuery官网是这样介绍form.js A simple way to AJAX-ify any form on your page; with file upload and progress s ...
- Redis数据结构之哈希
这个部分依旧分为两个步骤,一个是redis客户端,一个是java的客户端 一:Redis客户端 1.get与set 2.删除 3.增加 4.是否存在 hexists myhash2 age 5.获取长 ...
- 005 Spark快速入门的简单程序案例
参考:官网的quick start http://spark.apache.org/docs/1.6.0/quick-start.html 这里只是在shell命令行中简单的书写一些命令,做一个简单的 ...
- 084 HBase的数据迁移(含HDFS的数据迁移)
1.查找命令 bin/hadoop 2.启动两个HDFS集群 hadoop0,hadoop1,都是伪分布式的集群 3.启动hadoop3的zookeeper与hbase 注意点:需要开启yarn服务, ...
- metasploit常用服务扫描和利用模块
metasploit常用服务扫描和利用模块 SMB扫描 smb枚举auxiliary/scanner/smb/smb_enumusers 扫描命名管道auxiliary/scanner/smb/pip ...
- 微信小程序:一起玩连线,一个算法来搞定
微信小程序:一起玩连线 游戏玩法 将相同颜色的结点连接在一起,连线之间不能交叉. 算法思想 转换为多个源点到达对应终点的路径问题,且路径之间不相交.按照dfs方式寻找两个结点路径,一条路径探索完之后, ...