MacOS X 10.6 下 编译APUE代码清单(apue.2e 第二版源码)

本文介绍如何在macOS系统上成功编译《UNIX环境高级编程(第二版)》中的示例代码,包括修改Make.defines.macos文件以适配实际代码路径、调整apue.h文件以兼容macOS系统特性等步骤。

1、修改文件Make.defines.macos设置代码目录变量,将WKDIR值改为实际代码目录

$ vim Make.defines.macos


2、修改WKDIR/include/apue.h文件的6-11行如下所示,增加MACOS判断,如果不修改文件,

则定义_XOPEN_SOURCE为600,在macOS中头文件中,部分文件依据_XOPEN_SOURCE是否定义,来定义宏。

#if defined(SOLARIS)

#define _XOPEN_SOURCE   500     /* Single UNIX Specification, Version 2  for Solaris 9 */
#define CMSG_LEN(x)     _CMSG_DATA_ALIGN(sizeof(struct cmsghdr)+(x))
#elif defined(MACOS) /*增加的*/
#elif !defined(BSD)
#define _XOPEN_SOURCE   600     /* Single UNIX Specification, Version 3 */
#endif

3、在WKDIR下,编译即可。

$ make


(注:Mac OS X 10.6.8系统,APUE代码是《UNIX环境高级编程(第二版)》,解压后为apue.2e文件夹)


 

在之前编译时,遇到过CMSG_LEN未定义的问题,根据http://www.apuebook.com/上的FAQs第10条,将CMSG_LEN的定义从系统include文件中找到了CMSG_LEN,在apue.h加了CMSG_LEN的定义,可以编译通过,但是接下来又遇到问题:

loop.c里的error: ‘fd_set’ undeclared。

fd_set是一个struct,将#include <sys/select.h>加进来可以解决问题。

但是紧接着又有major与minor宏未定义的问题,也可以通过查找macOS的/usr/include下grep查找找到头文件解决问题。

 

根据文章上面写的方法,就没有定义_XOPEN_SOURCE了。也就不遵循标准了?

查了一下关于_XOPEN_SOURCE

it tells your compiler to include definitions for some extra functions that are defined in the X/Open and POSIX standards.

This will give you some extra functionality that exists on most recent UNIX/BSD/Linux systems, but probably doesn't exist on other systems such as Windows.

The numbers refer to different versions of the standard.

具体的作用还得有时间再摸索摸索。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值