apue.3e的编译运行+Ubuntu20.04

主要参考资料:

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

但报错如下:

apue.3e的编译运行+Ubuntu20.04

看了网上资料后,尝试添加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>,如下图所示

apue.3e的编译运行+Ubuntu20.04

再次执行make命令,虽然上一个错误解决了,但又出现了新的错误

apue.3e的编译运行+Ubuntu20.04

 依旧参考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

apue.3e的编译运行+Ubuntu20.04

上一篇:如何修复最常见的 macOS 11 Big Sur 问题?


下一篇:HoverTree开发日志之验证码