一、问题描述: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环境高级编程·第三版》源代码编译及使用