apue.3e的编译运行+Ubuntu20.04
主要参考资料:
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命令,报错依旧如上
参考了Ubuntu20.04 编译运行apue.3e 避坑指南和另外一篇博客,得到的解决方法为:打开apue.3e/include目录下的apue.h文件,在其中添加#include <sys/sysmacros.h>,如下图所示
再次执行make命令,虽然上一个错误解决了,但又出现了新的错误
依旧参考Ubuntu20.04 编译运行apue.3e 避坑指南,主要做了两件事:
- 打开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中找到相对应的可执行文件,此段代码对应的文件是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
-
- 当然也可以自己编写代码文件,手动编译运行
- 这里将其存为名为test1.c的文件,运行如下(注意:编译test1.c时需要在命令后加上-l apue)
-
lmy@lmy-LAPTOP:~/linux_unix$ cc test1.c -l apue lmy@lmy-LAPTOP:~/linux_unix$ ls a.out apue.3e test1.c lmy@lmy-LAPTOP:~/linux_unix$ ./a.out /home lmy . lost+found .. lmy@lmy-LAPTOP:~/linux_unix$ ls /home lmy lost+found