Unix环境高级编程中的apue.h配置

版权声明:xueliangwang https://blog.csdn.net/ShyLoneGirl/article/details/83662587

本文解释Unix环境高级编程的环境搭建中,apue.h如何使用安装及问题解决。

  • 使用的是《Unix环境高级编程》第三版
  • 系统为CentOS 7.4,64位(Linux系统都可参考);

下载编译源码包

首先从官网下载源码包

wget http://www.apuebook.com/src.3e.tar.gz

在这里插入图片描述
解压后计入目录,执行

[root@VM_0_13_centos APUE]# ls
apue.3e  src.3e.tar.gz
[root@VM_0_13_centos APUE]# cd apue.3e/
[root@VM_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

我们先说如何解决,下载下面两个包,libbsdlibbsd-devel

在这里插入图片描述

之后我们再次make一下,注意不用make install哦。

在这里插入图片描述

然后呢,将头文件和运行库拷贝到系统的环境变量。

[root@VM_0_13_centos apue.3e]# cp include/apue.h /usr/include/
[root@VM_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函数的定义。因而这种解决方案是正解。

在这里插入图片描述

.
.
.
.
.
.
桃花仙人种桃树,又摘桃花换酒钱_

猜你喜欢

转载自blog.csdn.net/ShyLoneGirl/article/details/83662587
今日推荐