Unix环境高级编程中的apue.h配置
本文解释Unix环境高级编程的环境搭建中,apue.h如何使用安装及问题解决。
- 使用的是《Unix环境高级编程》第三版;
- 系统为CentOS 7.4,64位(Linux系统都可参考);
下载编译源码包
首先从官网下载源码包
wget http://www.apuebook.com/src.3e.tar.gz
解压后计入目录,执行
[[email protected]_0_13_centos APUE]# ls
apue.3e src.3e.tar.gz
[[email protected]_0_13_centos APUE]# cd apue.3e/
[[email protected]_0_13_centos apue.3e]# make
报错和解决
CentOS一定会遇到这个问题的
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE barrier.c -o barrier -L../lib -lapue -pthread -lrt -lbsd
/tmp/cczvZtnw.o: In function `thr_fn':
barrier.c:(.text+0x80): undefined reference to `heapsort'
collect2: error: ld returned 1 exit status
make[1]: *** [barrier] Error 1
make[1]: Leaving directory `/home/APUE/apue.3e/threads'
make: *** [all] Error 1
我们先说如何解决,下载下面两个包,libbsd 和 libbsd-devel
之后我们再次make一***意不用make install哦。
然后呢,将头文件和运行库拷贝到系统的环境变量。
[[email protected]_0_13_centos apue.3e]# cp include/apue.h /usr/include/
[[email protected]_0_13_centos apue.3e]# cp lib/libapue.a /usr/lib
测试
新建一个 .c 测试文件(APUE的第一段代码,实现Linux的 ls命令的功能),如下。
// apue_ls.c
#include "apue.h"
#include <dirent.h>
int main (int argc,char *argv[])
{
DIR *dp;
struct dirent *dirp;
if (argc != 2)
err_quit("usage:ls directory_name");
if ((dp = opendir(argv[1])) == NULL)
err_sys("cannot open %s",argv[1]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n",dirp->d_name);
closedir(dp);
exit(0);
}
编译并运行,结果如下图。OK。
解释说明
看到论坛有些同学说出现make apue包出现错误跟libbsd没有关系,不用管他就行了。确实,我照做了运行上面的测试示例没得问题。但是谁又能保证以后不出问题呢?所以我们扒一扒问题又来。
报错信息中这样一句,
barrier.c:(.text+0x80): undefined reference to `heapsort'
他说在 barrier.c 文件中这个堆排序函数没有定义过,我们找到源代码,在 /threads/ 目录下,看下图。程序所说的意思在Solaris之外的系统中,要用到一个外部的叫做 heapsort 的方法,而我们搜索了该源码包的所有目录,并没有定义这个函数。
==然而!==查看安装libbsd生成的动态链接库内,正好有这heapsort函数的定义。因而这种解决方案是正解。
.
.
.
.
.
.
桃花仙人种桃树,又摘桃花换酒钱_