apue源码编译

apue的源码可以从官方网站获得(http://www.apuebook.com/ ):

 

.h文件一般用来声明局部变量,定义宏(当然只是习惯而已),所以apue.h头文件中声明了一些诸如err_ret函数和定义了一些宏,但是函数没有实现,如果下载了源码的话,就会看到其实函数的实现在lib/*c文件中,所以如果要使用这些函数的话(比如err_ret),不能简单的在

源程序中include“apue.h",这样一些函数就没有定义。

 

方式1:

按照作者的思路,把那些*.c文件编译成目标文件,然后做成libapue.a),然后就可以在编译具体的文件时,通过命令行参数-L指定要添加的目标文件,-I指定头文件(apue.h).

 

方式2:

直接在源程序中添加#include"lib/*c"文件,这样也可以,但是比较怪,从原理上说没有错。

 

下面采用地一种方式编译那些*c文件:

 

$tar xzvf src.tar.gz -C /home/wolf/ $cd apue.2e 下面把配置文件改动一下: Make.defines.linux下的WKDIR改为自己的工作目录,我的是 /home/wolf/apue.2e 把std目录下面的linux.mk里面的nawk改为gawk(或awk)。因为在linux发行版中常见的是gawk(和awk),必须要确保自己安装了gawk(或/和awk) 在apue.2e/include/apue.h中添加一行: #define ARG_MAX 4096 打开apue.2e/threadctl/getenv3.c,添加一行: #include "apue.h" $make 在lib目录下生成了目标文件(库)

 

我把能成功编译的文件打包放在这里: http://u.115.com/file/f51703f46f

 

如果要编译fig1.7,可以这么做:

 

$mv fig1.7 fig1.7.c $gcc -Wall fig1.7.c -o fig1.7 -Iinclude -Llib -lapue

 

关于gcc 选项-I , -L, -l 参考在线帮助文档:

 

-llibrary 连接 名为 library 的 库文件. 连接器 在 标准搜索目录 中 寻找 这个 库文件, 库文件 的 真正 名字 是 `liblibrary.a'. 连接器 会 当做 文件名 得到 准确 说明 一样 引用 这个文件. 搜索目录 除了 一些 系统标准目录 外, 还包括 用户 以 `-L' 选项 指定 的 路径. 一般说来 用 这个方法 找到的 文件 是 库文件—即由 目标文件 组成的 归档文件 (archive file). 连接器 处理 归档文件 的 方法 是: 扫描 归档文件, 寻找 某些 成员, 这些 成员 的 符号 目前 已 被引用, 不过 还没有 被定义. 但是, 如果 连接器 找到 普通的 目标文件, 而不是 库文件, 就把 这个 目标文件 按 平常方式 连接 进来. 指定 `-l' 选项 和 指定 文件名 的 唯一 区别 是, `-l选项 用 `lib' 和 `.a' 把 library 包裹 起来, 而且 搜索 一些 目录. -Idir 在 头文件 的 搜索路径 列表 中 添加 dir 目录. -Ldir 在 `-l' 选项 的 搜索路径 列表 中 添加 dir 目录.

 

*************************************************************************************************

更新:


在最新的FreeBSD(8.2)中,已经没有结构体acct,具体可以查看 /usr/include/sys/acct.h ,只有acctv1和acctv2,其中

acctv1就是以前acct。如果编译apue的源码出现错误:


pracct.c: In function 'main': pracct.c:31: error: storage size of 'acdata' isn't known pracct.c:31: warning: unused variable 'acdata'

则把apue.2e/proc/pracct.c里面的acct改为acctv1,make即可。

你可能感兴趣的:(apue源码编译)