解决《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 foundmake[2]: *** [conf.c] Error 127make[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 statusmake[2]: *** [conf] Error 1make[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.aUndefined symbols for architecture x86_64:"_CMSG_LEN", referenced from:_recv_fd in libapue.a(recvfd.o)ld: symbol(s) not found for architecture x86_64collect2: 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 环境高级 ...
随机推荐
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- Pycharm 有些库(函数)没有代码提示
问题描述 如图,输入变量im. 后没有关于第三方库相应的函数或其他提示,当然,此文档的前提是有相关的函数说明以及已有相关设置等 解决方案 python是动态强类型语言,IDE无法判断Image.op ...
- BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...
- Redis数据结构之哈希
这个部分依旧分为两个步骤,一个是redis客户端,一个是java的客户端 一:Redis客户端 1.get与set 2.删除 3.增加 4.是否存在 hexists myhash2 age 5.获取长 ...
- Map的知识点梳理(不包含collections工具类)
一:基础公共方法(map不再是简单的加索引,可以直接命名key,通过key进行遍历) 1.常见的map子类 HashTable:底层是哈希表结构.不允许null键和null值,线程同步 HashMap ...
- Spring日记_01 之 Eclipse下的Tomcat服务器配置 以及 Springmvc和Servlet的使用
安装Tomcat – window – preferences – Server 右键Tomcat v ...
- Java中的Lambda表达式
Lambda来源于希腊字母入,发音为 /'læmdə/对高数有所了解的人都知道λ用于声明一个数学逻辑系统,表示根据XX的输入参数,会返回某个Y结果.这正是编程语言中函数(方法)的意思.因此Lambd ...
- BroadcastReceiver广播接受者
广播接收器的两种注册方式: 1)动态注册:在代码中注册,创建一个IntentFilter(意图过滤器)对象,设置想要就收的广播,在onCreate()方法中通过调用registerReceiver() ...
- 爬虫之Resquests模块的使用(二)
Requests Requests模块 Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能 ...
- java注解的概念理解
1. 注解(标注)概念:从字面意思理解是对被标注的对象(类,接口,枚举,注解类,方法,参数)的一个标记,有这个标记有什么用呢?就像学习中“划重点”的方式一样,被标记的对象肯定是特殊需要特别关照的对象, ...