《Unix环境高级编程第三版》apue.3e在Linux上编译中遇到问题的处理

本文详细记录了在Linux环境下编译《Unix环境高级编程》第三版源代码时遇到的两个问题及其解决方案。问题一是由于缺少libbsd库导致的编译错误,通过在Fedora或Ubuntu系统中安装对应库即可解决。问题二是源代码中关于FILE结构体成员引用错误,修正为正确的成员名后成功编译。通过这些步骤,读者可以解决类似问题并顺利进行源码学习。
摘要由CSDN通过智能技术生成

一、问题描述:make,遇到错误:cannot find -lbsd 。

二、原因:缺少缺少libbsd文件。

三、解决方法:

1、Fedora 系列(通过yum来下载更新软件)

#yum install libbsd

#yum install libbsd-devel

安装完成后就可以去apue.3e目录make了。

2、Ubuntu 系列(通过apt-get来下载和更新软件)

sudo apt-get install libbsd-dev

安装完成后就可以去apue.3e目录make了。

我遇到的问题是,在apue.3e目录中make报出一些错误:
错误一:

make[1]: Entering directory '/home/pi/Downloads/apue.3e/filedir'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  access.c -o access  -L../lib -lapue 
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  cdpwd.c -o cdpwd  -L../lib -lapue 
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  changemod.c -o changemod  -L../lib -lapue 
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  devrdev.c -o devrdev  -L../lib -lapue 
devrdev.c: In function ‘main’:
devrdev.c:19:25: warning: implicit declaration of function ‘major’ [-Wimplicit-function-declaration]
   printf("dev = %d/%d", major(buf.st_dev),  minor(buf.st_dev));
                         ^~~~~
devrdev.c:19:45: warning: implicit declaration of function ‘minor’; did you mean ‘mknod’? [-Wimplicit-function-declaration]
   printf("dev = %d/%d", major(buf.st_dev),  minor(buf.st_dev));
                                             ^~~~~
                                             mknod
/usr/bin/ld: /tmp/ccUJTVJZ.o: in function `main':
devrdev.c:(.text+0x88): undefined reference to `major'
/usr/bin/ld: devrdev.c:(.text+0x9c): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0xfc): undefined reference to `major'
/usr/bin/ld: devrdev.c:(.text+0x110): undefined reference to `minor'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:18: devrdev] Error 1
make[1]: Leaving directory '/home/pi/Downloads/apue.3e/filedir'
make: *** [Makefile:6: all] Error 1

解决办法:
在devrdev.c文件中,添加

#include <sys/sysmacros.h>

在这里插入图片描述

问题二:

gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  options.c -o options  -L../lib -lapue 
make[1]: Leaving directory '/home/pi/Downloads/apue.3e/standards'
making stdio
make[1]: Entering directory '/home/pi/Downloads/apue.3e/stdio'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  buf.c -o buf  -L../lib -lapue 
buf.c: In function ‘is_unbuffered’:
buf.c:99:13: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_flag’; did you mean ‘_flags’?
  return(fp->_flag & _IONBF);
             ^~~~~
             _flags
buf.c: In function ‘is_linebuffered’:
buf.c:105:13: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_flag’; did you mean ‘_flags’?
  return(fp->_flag & _IOLBF);
             ^~~~~
             _flags
buf.c: In function ‘is_unbuffered’:
buf.c:100:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
buf.c: In function ‘is_linebuffered’:
buf.c:106:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/home/pi/Downloads/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

解决办法:
将这两处的_flag改成_flags

int
is_unbuffered(FILE *fp)
{
	return(fp->_flags & _IONBF);
}

int
is_linebuffered(FILE *fp)
{
	return(fp->_flags & _IOLBF);
}

至此才成功编译:
在这里插入图片描述
如何安装,可以参考《unix环境高级编程·第三版》源代码编译及使用

参考:
《Unix环境高级编程第3版》apue.3e在Linux上无法安装的问题

《unix环境高级编程·第三版》源代码编译及使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值