主要参考资料:

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_APUE(3e)

看了网上资料后,尝试添加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_unix_02

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

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

 依旧参考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中找到相对应的可执行文件,此段代码对应的文件是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