《Unix环境高级编程》第三版源代码在CentOS 7、Ubuntu 20,2024年最新互联网公司面试流程&面试技巧

37 阅读8分钟

报错如下:

/usr/bin/ld: /tmp/cc4I3NHz.o: in function `main':
devrdev.c:(.text+0xc5): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0xdb): undefined reference to `major'
/usr/bin/ld: devrdev.c:(.text+0x128): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0x13e): undefined reference to `major'
collect2: error: ld returned 1 exit status
make[1]: \*\*\* [Makefile:18: devrdev] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/filedir'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

参考博文:Ubuntu20.04 编译运行apue.3e 避坑指南
Unix 环境高级编程书(第三版)源码编译(apue.3e)
Unix环境高级编程(第3版)环境搭建
sudo cat -n ./filedir/devrdev.c | grep "#endif"看到./filedir/devrdev.c里边只有第4行中有#endif这个字符串,sudo cat -n ./filedir/devrdev.c | grep "#include <sys/sysmacros.h>"可以看到./filedir/devrdev.c文件里边没有#include <sys/sysmacros.h>这个头文件。
在这里插入图片描述

sudo sed -i 's:#endif:#endif\n#include <sys/sysmacros.h>:g' ./filedir/devrdev.c文件里边的字符串#endif下添加#include <sys/sysmacros.h>一行头文件,sudo cat -n ./filedir/devrdev.c | grep "#include <sys/sysmacros.h>"可以看到#include <sys/sysmacros.h>添加到./filedir/devrdev.c第5行了。
在这里插入图片描述

sudo make执行。
在这里插入图片描述

发现报错如下:

gcc -ansi -I../include -Wall -DLINUX -D\_GNU\_SOURCE  buf.c -o buf  -L../lib -lapue
buf.c: In function ‘is_unbuffered’:
buf.c:90:15: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   90 | #define \_flag \_\_pad[4]
      |               ^~~~~
buf.c:98:13: note: in expansion of macro ‘_flag’
   98 |  return(fp->_flag & _IONBF);
      |             ^~~~~
buf.c: In function ‘is_linebuffered’:
buf.c:90:15: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   90 | #define \_flag \_\_pad[4]
      |               ^~~~~
buf.c:104:13: note: in expansion of macro ‘_flag’
  104 |  return(fp->_flag & _IOLBF);
      |             ^~~~~
buf.c: In function ‘buffer_size’:
buf.c:92:15: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   92 | #define \_base \_\_pad[2]
      |               ^~~~~
buf.c:111:13: note: in expansion of macro ‘_base’
  111 |  return(fp->_base - fp->_ptr);
      |             ^~~~~
buf.c:91:14: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘__pad’; did you mean ‘__pad5’?
   91 | #define \_ptr \_\_pad[1]
      |              ^~~~~
buf.c:111:25: note: in expansion of macro ‘_ptr’
  111 |  return(fp->_base - fp->_ptr);
      |                         ^~~~
buf.c: In function ‘is_unbuffered’:
buf.c:99:1: warning: control reaches end of non-void function [-Wreturn-type]
   99 | }
      | ^
buf.c: In function ‘is_linebuffered’:
buf.c:105:1: warning: control reaches end of non-void function [-Wreturn-type]
  105 | }
      | ^
buf.c: In function ‘buffer_size’:
buf.c:115:1: warning: control reaches end of non-void function [-Wreturn-type]
  115 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述
需要把下边的内容删除:

#ifdef \_LP64
#define \_flag \_\_pad[4]
#define \_ptr \_\_pad[1]
#define \_base \_\_pad[2]
#endif

可以直接使用vim找到上边的内容,然后进行删除。但是我这里采取sed的删除方法,接下来的操作就是为了删除上边的内容,sudo sed -n '89,+4p' ./stdio/buf.c可以看到上边的内容是在89~93行。
在这里插入图片描述

sudo sed '89,93d' ./stdio/buf.c > ./stdio/buf_bak.c可以把89~93行删除之后的内容保存到./stdio/buf_bak.c
在这里插入图片描述

sudo rm -rf ./stdio/buf.c./stdio/buf.c文件删除,sudo cp ./stdio/buf_bak.c ./stdio/buf.cbuf_bak.c更名为buf.csudo sed -n '89,+4p' ./stdio/buf.c可以看到89~93行内容已经更改了。
在这里插入图片描述

sudo cat -n ./stdio/buf.c | grep "_flag"看一下_flag./stdio/buf.c中的位置。
在这里插入图片描述

sudo sed -i 's:return(fp->_flag \& _IONBF);:return(fp->_flags \& _IONBF);:g' ./stdio/buf.creturn(fp->_flag \& _IONBF);替换为return(fp->_flags \& _IONBF);,将fp->_flag后加个s
sudo sed -i 's:return(fp->_flag \& _IOLBF);:return(fp->_flags \& _IOLBF);:g' ./stdio/buf.creturn(fp->_flag \& _IOLBF);替换为return(fp->_flags \& _IOLBF);,将fp->_flag后加个s
在这里插入图片描述

sudo make clean && sudo make执行。
在这里插入图片描述

发现报错如下:

buf.c: In function ‘buffer_size’:
buf.c:106:11: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_base’
  106 |  return(fp->_base - fp->_ptr);
      |           ^~
buf.c:106:23: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_ptr’
  106 |  return(fp->_base - fp->_ptr);
      |                       ^~
buf.c:110:1: warning: control reaches end of non-void function [-Wreturn-type]
  110 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

sudo sed -i 's:return(fp->_base - fp->_ptr);:return(fp->_IO_buf_end - fp->_IO_buf_base);:g' ./stdio/buf.creturn(fp->_base - fp->_ptr);替换为return(fp->_IO_buf_end - fp->_IO_buf_base);
在这里插入图片描述

sudo make clean && sudo make执行。
在这里插入图片描述

发现报错

/usr/bin/ld: cannot find -lbsd
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:31: badexit2] Error 1
make[1]: Leaving directory '/code/clanguagecode/apue.3e/threads'
make: *** [Makefile:6: all] Error 1

在这里插入图片描述

sudo apt-get install -y libbsd-dev安装libbsd-dev
在这里插入图片描述

sudo make clean && sudo make执行。
在这里插入图片描述

完成如下:
在这里插入图片描述

Ubuntu 22.04 进行编译

lsb_release -a看到操作系统的版本是Ubuntu 22.04 LTSuname -r看到操作系统内核的版本是5.15.0-86-genericgcc --version看到gcc的版本是11.2.0
在这里插入图片描述
sudo apt-get install -y libbsd-dev安装libbsd-dev
在这里插入图片描述
sudo wget http://www.apuebook.com/src.3e.tar.gz下载源代码。
在这里插入图片描述

sudo tar xf src.3e.tar.gz进行解压,cd apue.3e/进入到解压的源代码目录里边。
在这里插入图片描述

sudo cat -n ./filedir/devrdev.c | grep "#endif"看到./filedir/devrdev.c里边只有第4行中有#endif这个字符串,sudo cat -n ./filedir/devrdev.c | grep "#include <sys/sysmacros.h>"可以看到./filedir/devrdev.c文件里边没有#include <sys/sysmacros.h>这个头文件。
在这里插入图片描述

sudo sed -i 's:#endif:#endif\n#include <sys/sysmacros.h>:g' ./filedir/devrdev.c文件里边的字符串#endif下添加#include <sys/sysmacros.h>一行头文件,sudo cat -n ./filedir/devrdev.c | grep "#include <sys/sysmacros.h>"可以看到#include <sys/sysmacros.h>添加到./filedir/devrdev.c第5行了。
在这里插入图片描述

需要把下边的内容删除:

#ifdef \_LP64
#define \_flag \_\_pad[4]
#define \_ptr \_\_pad[1]
#define \_base \_\_pad[2]
#endif

可以直接使用vim找到上边的内容,然后进行删除。但是我这里采取sed的删除方法,接下来的操作就是为了删除上边的内容,sudo sed -n '89,+4p' ./stdio/buf.c可以看到上边的内容是在89~93行。
在这里插入图片描述

sudo sed -i '89,93d' ./stdio/buf.c可以把8993行删除,sudo sed -n '89,+4p' ./stdio/buf.c可以看到8993行内容已经更改了。
在这里插入图片描述

sudo cat -n ./stdio/buf.c | grep "_flag"看一下_flag./stdio/buf.c中的位置。
在这里插入图片描述

sudo sed -i 's:return(fp->_flag \& _IONBF);:return(fp->_flags \& _IONBF);:g' ./stdio/buf.creturn(fp->_flag \& _IONBF);替换为return(fp->_flags \& _IONBF);,将fp->_flag后加个s
sudo sed -i 's:return(fp->_flag \& _IOLBF);:return(fp->_flags \& _IOLBF);:g' ./stdio/buf.creturn(fp->_flag \& _IOLBF);替换为return(fp->_flags \& _IOLBF);,将fp->_flag后加个s
在这里插入图片描述

sudo make执行。
在这里插入图片描述
发现报错如下:

gcc -ansi -I../include -Wall -DLINUX -D\_GNU\_SOURCE   -c -o getpwnam.o getpwnam.c
make[1]: Leaving directory '/home/ubuntu/assemblylanguage/apue.3e/datafiles'
making db
make[1]: Entering directory '/home/ubuntu/assemblylanguage/apue.3e/db'
gcc -fPIC -ansi -I../include -Wall -DLINUX -D\_GNU\_SOURCE  -c db.c
gcc -shared -Wl,-dylib -o libapue_db.so.1 -L../lib -lapue -lc db.o
/usr/bin/ld: Error: unable to disambiguate: -dylib (did you mean --dylib ?)
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:32: libapue_db.so.1] Error 1
make[1]: Leaving directory '/home/ubuntu/assemblylanguage/apue.3e/db'
make: *** [Makefile:6: all] Error 1

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 img img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!