报错如下:
/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.c把buf_bak.c更名为buf.c,sudo 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.c将return(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.c将return(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.c将return(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 LTS,uname -r看到操作系统内核的版本是5.15.0-86-generic,gcc --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行删除,93行内容已经更改了。sudo sed -n '89,+4p' ./stdio/buf.c可以看到89
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.c将return(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.c将return(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年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!