《Unix环境高级编程》第三版源代码编译

CentOS 7.6 进行编译

使用cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810 (Core),使用uname -r看到内核是3.10.0-957.el7.x86_64gcc --version可以看到gcc版本是4.8.5
在这里插入图片描述

wget http://www.apuebook.com/src.3e.tar.gz下载《Unix环境高级编程》第三版里边提供的源代码。
在这里插入图片描述

tar -xf src.3e.tar.gz进行解压,cd apue.3e/进入到解压的源代码目录里边。
在这里插入图片描述
执行make
在这里插入图片描述

报错如下:

/tmp/ccMz5Ijf.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 `/code/clanguagecode/apue.3e/threads'
make: *** [all] Error 1

在这里插入图片描述

yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
在这里插入图片描述

yum install -y libbsd libbsd-devel安装。
在这里插入图片描述

成功截图如下:

在这里插入图片描述

make再次执行。
在这里插入图片描述

执行成功如下:
在这里插入图片描述

Ubuntu 20.04 进行编译

lsb_release -a看到操作系统的版本是Ubuntu 20.04.4uname -r看到操作系统内核的版本是5.4.0-100-genericgcc --version看到gcc的版本是9.3.0
在这里插入图片描述

sudo wget http://www.apuebook.com/src.3e.tar.gz下载源代码。
在这里插入图片描述

sudo tar xf src.3e.tar.gz进行解压,cd apue.3e/进入到解压的源代码目录里边。
在这里插入图片描述

sudo make进行编译。
在这里插入图片描述

报错如下:

/usr/bin/ld: /tmp/cc4I3NHz.o: in function `main':
devrdev.c:(.text+0xc5): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0xdb): undefined reference to `major'
/usr/bin/ld: devrdev.c:(.text+0x128): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0x13e): undefined reference to `major'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:18: devrdev] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/filedir'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

参考博文:Ubuntu20.04 编译运行apue.3e 避坑指南
Unix 环境高级编程书(第三版)源码编译(apue.3e)
Unix环境高级编程(第3版)环境搭建
sudo cat -n ./filedir/devrdev.c | grep "#endif"看到./filedir/devrdev.c里边只有第4行中有#endif这个字符串,sudo cat -n ./filedir/devrdev.c | grep "#include <sys/sysmacros.h>"可以看到./filedir/devrdev.c文件里边没有#include <sys/sysmacros.h>这个头文件。
在这里插入图片描述

sudo sed -i 's:#endif:#endif\n#include <sys/sysmacros.h>:g' ./filedir/devrdev.c文件里边的字符串#endif下添加#include <sys/sysmacros.h>一行头文件,sudo cat -n ./filedir/devrdev.c | grep "#include <sys/sysmacros.h>"可以看到#include <sys/sysmacros.h>添加到./filedir/devrdev.c第5行了。
在这里插入图片描述

sudo make执行。
在这里插入图片描述

发现报错如下:

gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  buf.c -o buf  -L../lib -lapue
buf.c: In function ‘is_unbuffered’:
buf.c:90:15: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   90 | #define _flag __pad[4]
      |               ^~~~~
buf.c:98:13: note: in expansion of macro ‘_flag’
   98 |  return(fp->_flag & _IONBF);
      |             ^~~~~
buf.c: In function ‘is_linebuffered’:
buf.c:90:15: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   90 | #define _flag __pad[4]
      |               ^~~~~
buf.c:104:13: note: in expansion of macro ‘_flag’
  104 |  return(fp->_flag & _IOLBF);
      |             ^~~~~
buf.c: In function ‘buffer_size’:
buf.c:92:15: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   92 | #define _base __pad[2]
      |               ^~~~~
buf.c:111:13: note: in expansion of macro ‘_base’
  111 |  return(fp->_base - fp->_ptr);
      |             ^~~~~
buf.c:91:14: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   91 | #define _ptr __pad[1]
      |              ^~~~~
buf.c:111:25: note: in expansion of macro ‘_ptr’
  111 |  return(fp->_base - fp->_ptr);
      |                         ^~~~
buf.c: In function ‘is_unbuffered’:
buf.c:99:1: warning: control reaches end of non-void function [-Wreturn-type]
   99 | }
      | ^
buf.c: In function ‘is_linebuffered’:
buf.c:105:1: warning: control reaches end of non-void function [-Wreturn-type]
  105 | }
      | ^
buf.c: In function ‘buffer_size’:
buf.c:115:1: warning: control reaches end of non-void function [-Wreturn-type]
  115 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述
需要把下边的内容删除:

#ifdef _LP64
#define _flag __pad[4]
#define _ptr __pad[1]
#define _base __pad[2]
#endif

可以直接使用vim找到上边的内容,然后进行删除。但是我这里采取sed的删除方法,接下来的操作就是为了删除上边的内容,sudo sed -n '89,+4p' ./stdio/buf.c可以看到上边的内容是在89~93行。
在这里插入图片描述

sudo sed '89,93d' ./stdio/buf.c > ./stdio/buf_bak.c可以把89~93行删除之后的内容保存到./stdio/buf_bak.c
在这里插入图片描述

sudo rm -rf ./stdio/buf.c./stdio/buf.c文件删除,sudo cp ./stdio/buf_bak.c ./stdio/buf.cbuf_bak.c更名为buf.csudo sed -n '89,+4p' ./stdio/buf.c可以看到89~93行内容已经更改了。
在这里插入图片描述

sudo cat -n ./stdio/buf.c | grep "_flag"看一下_flag./stdio/buf.c中的位置。
在这里插入图片描述

sudo sed -i 's:return(fp->_flag \& _IONBF);:return(fp->_flags \& _IONBF);:g' ./stdio/buf.creturn(fp->_flag \& _IONBF);替换为return(fp->_flags \& _IONBF);,将fp->_flag后加个s
sudo sed -i 's:return(fp->_flag \& _IOLBF);:return(fp->_flags \& _IOLBF);:g' ./stdio/buf.creturn(fp->_flag \& _IOLBF);替换为return(fp->_flags \& _IOLBF);,将fp->_flag后加个s
在这里插入图片描述

sudo make clean && sudo make执行。
在这里插入图片描述

发现报错如下:

buf.c: In function ‘buffer_size’:
buf.c:106:11: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_base’
  106 |  return(fp->_base - fp->_ptr);
      |           ^~
buf.c:106:23: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_ptr’
  106 |  return(fp->_base - fp->_ptr);
      |                       ^~
buf.c:110:1: warning: control reaches end of non-void function [-Wreturn-type]
  110 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

sudo sed -i 's:return(fp->_base - fp->_ptr);:return(fp->_IO_buf_end - fp->_IO_buf_base);:g' ./stdio/buf.creturn(fp->_base - fp->_ptr);替换为return(fp->_IO_buf_end - fp->_IO_buf_base);
在这里插入图片描述

sudo make clean && sudo make执行。
在这里插入图片描述

发现报错

/usr/bin/ld: cannot find -lbsd
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:31: badexit2] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/threads'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

sudo apt-get install -y libbsd-dev安装libbsd-dev
在这里插入图片描述

sudo make clean && sudo make执行。
在这里插入图片描述

完成如下:
在这里插入图片描述

执行示例代码

apue.3e/figlinks目录下有书本代码图片编号对应示例代码的软连接,可以更快找到对应源码。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java学习路程之篇一、进阶知识、面向对象高级、static关键字、继承、final关键字、this、super

文章目录 1、面向对象高级2、static关键字3、继承4、final关键字 1、面向对象高级 2、static关键字 3、继承 4、final关键字

MyBatis学习笔记——4

MyBatis学习笔记——4 一、MyBatis的高级映射及延迟加载1.1、多对一1.1.1、第一种方式&#xff1a;级联属性映射1.1.2、第二种方式&#xff1a;association1.1.3、第三种方式&#xff1a;分步查询 1.2、一对多1.2.1、第一种方式&#xff1a;collection1.2.1、第二种方式&#x…

【OAuth2】OAuth2概述及使用GitHub登录第三方网站

【OAuth2】OAuth2概述及使用GitHub登录第三方网站 文章目录 【OAuth2】OAuth2概述及使用GitHub登录第三方网站0. 导言1. OAuth2 简介2. OAuth2 认证授权总体流程3. OAuth2 标准接口4. OAuth2 四种授权模式4.1 授权码模式4.2 简化模式4.3 密码模式4.4 客户端模式 5. GitHub授权登…

Docker 的数据管理、容器互联、镜像创建

目录 一、数据管理 1.数据卷 2. 数据卷容器 二、容器互联&#xff08;使用centos镜像&#xff09; 三、Docker 镜像的创建 1.基于现有镜像创建 1.1首先启动一个镜像&#xff0c;在容器里修改 1.2将修改后的容器提交为新的镜像&#xff0c;需使用该容器的id号创建新镜像 …

电脑显示连接上WiFi,但没办法上网

问题: 电脑显示已经连接上WiFi。但是百度不出来东西&#xff0c;也没办法打开任何网页。 解决方法&#xff1a; win10系统 在左下角搜索栏&#xff0c;搜索“代理服务器设置”。 找到手动设置代理 —》关闭“使用代理服务” 【默认是打开的】 关闭之后即可上网~~

【Git】分支合并冲突产生与解决

文章学习自&#xff1a;麦兜搞IT&#xff0c;如有侵权&#xff0c;告知删除 文章目录 前言1 Fast Forword 合并1.1 核心原理1.2 举个栗子1.3 经验之谈 2 three way merge2.1 核心原理2.2 举个栗子&#xff08;不带冲突&#xff09;2.3 带冲突的three way merge 3 变基rebase3.…

Android WiFi框架概览

概览 Android 提供默认 Android 框架实现&#xff0c;其中包括对各种 WLAN 协议和模式的支持&#xff0c;这些协议和模式包括&#xff1a; WLAN 基础架构 (STA)网络共享模式或仅限本地模式下的 WLAN 热点 (Soft AP)WLAN 直连&#xff08;点对点&#xff09;WLAN 感知 (NAN)WL…

【简单认识MySQL主从复制与读写分离】

文章目录 一、MySQL主从复制1、配置主从复制的原因&#xff1a;2、主从复制原理1、 MySQL的复制类型2、 MySQL主从复制的工作过程;1、 MySQL主从复制延迟2、优化方案&#xff1a;3、 MySQL 有几种同步方式&#xff1a; 三种4、异步复制&#xff08;Async Replication&#xff0…

Stream流List转Map报错Duplicate key StreamMap

项目场景&#xff1a; JDK8引入了Stream流&#xff0c;让程序员在开发中更方便进行集合之间的转换&#xff0c;在使用Stream流将List转为Map时&#xff0c;如果Map的key有重复的情况下&#xff0c;就会抛出java.lang.IllegalStateException: Duplicate key StreamMap这个异常。…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表&#xff1a;树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表&#xff0c;这样效率会高一些。 数组模拟单链表 邻接表&#xff1a;存储图和树 实…

KubeVela篇06:Kubevela Addon插件安装原理

addon支持从本地、git仓库、helm chart仓库安装,最终原理都相同,因此我们以本地安装为例。 完整流程如下: 从指定目录读取一个完整的addon安装包。 根据metadata.yaml配置文件,校验插件要求的kubevela、k8s的版本,不满足版本要求则终止安装。 根据metadata.yaml配置文件…

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

FPGA配置文件从串并模式下载

FPGA配置文件的下载模式有5种&#xff1a; 主串模式&#xff08;master serial&#xff09;从串模式&#xff08;slave serial&#xff09;主并模式&#xff08;master selectMAP&#xff09;从并模式&#xff08;slave selectMAP&#xff09;JTAG模式 其中&#xff0c;JTAG模…

信捷PLC RC低通滤波器(C语言实现)

PLC信号处理系列之RC低通滤波器算法详细介绍请参考下面文章: PLC信号处理系列之一阶低通(RC)滤波器算法_plc滤波算法程序_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较…

什么小程序需要商家自营相关类目?

1、百货&#xff1a;小程序主体公司综合零售商&#xff0c;在线售卖多种日用品&#xff0c;需补充商家自营-百货类目。预包装食品定义&#xff1a; 预包装食品&#xff0c;指预先定量包装或者制作在包装材料和容器中的食品&#xff1b;包括预先定量包装以及预先定量制作在包装…

配置右键点击文件夹通过IDEA打开项目

0、 前言 你是不是每次打开idea项目时&#xff0c;都需要走一遍这样的流程&#xff1a; 1、先启动idea 2、然后手动选择项目路径 3、打开项目 于是在打开项目的路上就耗费了大量的时间。 这篇文章会教你通过配置&#xff0c;让项目可以直接通过右键打开&#xff0c;大大提升项…

【JAVA】云HIS系统功能菜单知识(二)

随着医疗信息化和互联网技术的不断发展&#xff0c;云HIS在大数据管理和应用的优势日益凸显。对于医疗机构而言&#xff0c;云HIS平台可以帮助其实现更高效的医疗服务管理&#xff0c;并提高医疗服务的整体水平和效率。 一、系统管理 1.医院信息 基本信息、法人代表、主要负责…

【数据结构】链表是否有环相关问题

文章目录 快指针走3、4、5步甚至更多可以吗为什么快慢指针一定在入口点相遇![在这里插入图片描述](https://img-blog.csdnimg.cn/ba346dbc9fee425dbb895ae2962e99ce.png) 快指针走3、4、5步甚至更多可以吗 部分情况下可以。 如果这样&#xff0c;相对&#xff08;追及&#xf…

Linux -- 进阶 自动挂载服务 ( autofs ) 介绍及安装 主配置文件分析

背景引入 &#xff1a; 针对于 挂载 &#xff0c; 大家有没有思考过一个问题&#xff0c;如果我们需要挂载的文件或访问的远程数据甚至只是挂载一些设备&#xff0c;如果太多的话&#xff0c;数量很大的话&#xff0c;那 光每次挂载 敲的 mount 命令&#xff0c;都得敲很多遍…

【晓风残月】byte,short,int,long——八种基本类型

文章目录 前言废话不多说&#xff0c;总结下今天的成果以及踩的坑 一、第一个坑【数据丢失】二、第二个坑【byte集合无法转换byte数组】三、第三个坑【Byte[]转byte[]】四、第四个坑【16进制转byte】总结快一年没写博客了&#xff0c;貌似都不记得过去的自己了向前看&#xff1…