主要参考资料:
https://www.abaozhan.com/news_txtlist_i31502v.html
1.下载apue.3e源码
下载地址为:http://www.apuebook.com/src.3e.tar.gz
2.解压
可直接在文件夹中右键压缩包选择“提取到此处”
下述步骤均须在解压之后的apue.3e目录下进行
3.编译运行apue.3e
最开始直接执行make命令:
lmy@lmy-LAPTOP:~/linux_unix/apue.3e$ make
但报错如下:
看了网上资料后,尝试添加libbsd.a的静态链接库:
lmy@lmy-LAPTOP:~/linux_unix/apue.3e$ sudo apt-get install libbsd-dev
再次执行make命令,报错依旧如上
参考了https://www.abaozhan.com/news_txtlist_i31502v.html和另外一篇博客,得到的解决方法为:打开apue.3e/include目录下的apue.h文件,在其中添加#include <sys/sysmacros.h>,如下图所示
再次执行make命令,虽然上一个错误解决了,但又出现了新的错误
依旧参考https://www.abaozhan.com/news_txtlist_i31502v.html,主要做了两件事:
- 打开apue.3e/stdio/buf.c,删掉如下代码(文件的89~93行)
-
#ifdef _LP64 #define _flag __pad[4] #define _ptr __pad[1] #define _base __pad[2] #endif
- 并将buf.c文件余下的95~121行代码替换成如下代码(标粗的三处是修改的地方)
-
int is_unbuffered(FILE *fp) { return(fp->_flags & _IONBF); } int is_linebuffered(FILE *fp) { return(fp->_flags & _IOLBF); } int buffer_size(FILE *fp) { #ifdef _LP64 return(fp->_IO_buf_end - fp->_IO_buf_base); #else return(BUFSIZ); /* just a guess */ #endif } #else #error unknown stdio implementation! #endif
再次执行make命令就没有错误啦~
4.复制make生成的相关头文件和库文件到环境中去
sudo cp ./include/apue.h /usr/include/
sudo cp ./lib/libapue.a /usr/lib/
5.运行示例
以本书第一段代码myls为例,它也就是apue.3e/intro/ls1.c文件,执行过make命令之后,ls1.c所在的目录下有对应的ls1可执行文件,直接运行,结果如下所示
lmy@lmy-LAPTOP:~/linux_unix/apue.3e/intro$ ./ls1 . Makefile mycat shell1 getcputc.c ls1.c testerror.c shell2 mycat.c . uidgid.c hello shell2.c getcputc shell1.c .. hello.c testerror uidgid ls1 lmy@lmy-LAPTOP:~/linux_unix/apue.3e/intro$ ./ls1 root can‘t open root: No such file or directory