《Linux/Unix系统编程手册》源代码下载编译
下载进入代码下载界面http://man7.org/tlpi/code/index.html,选择Distribution version或者Book version,复制你选择的链接到shell中,像这样:wget "man7.org/tlpi/code/download/tlpi-190930-book.tar.gz"或者也可以使用其他下载方法。解压在当前目录打下面的命令:tar...
本教程不提供Linux环境的安装,但我可以给出一些建议。
- WSL(WIndows子系统)-微软官方教程。
- 安装双系统或者Linux单系统。
- 租一个Linux云服务器。
- 虚拟机。
下载源代码
进入代码下载界面http://man7.org/tlpi/code/index.html,选择Distribution version或者Book version,直接下载。
或者我们这里使用wget下载,像这样:
wget "man7.org/tlpi/code/download/tlpi-190930-book.tar.gz"
解压下载的包
在当前目录打下面的命令:
tar -xfz tlpi-190930-book.tar.gz
这里稍微科普一下xfz
的意义,这里有三个命令行参数,x代表extract(解压),f代表file(指定备份文件),z代表使用gzip解压,如果再加上v代表visible(显示操作过程)。
安装包的依赖库
安装一些依赖的库,我的系统是Ubuntu,根据BUILDING文档的要求安装依赖就好了:
sudo apt-get install libcap-dev
sudo apt-get install libacl1-dev
sudo apt-get install libselinux1-dev
编译源代码
然后进入解压出来的目录,用make编译整个项目:
cd tlpi-book
make
出现报错:
scm_cred_recv.c: In function ‘main’:
scm_cred_recv.c:20:5: error: unknown type name ‘bool’; did you mean ‘_Bool’?
bool useDatagramSocket;
^~~~
_Bool
scm_cred_recv.c:43:25: error: ‘false’ undeclared (first use in this function); did you mean ‘pause’?
useDatagramSocket = false;
^~~~~
pause
scm_cred_recv.c:43:25: note: each undeclared identifier is reported only once for each function it appears in
scm_cred_recv.c:48:33: error: ‘true’ undeclared (first use in this function); did you mean ‘free’?
useDatagramSocket = true;
^~~~
free
<内置>: recipe for target 'scm_cred_recv.o' failed
make[1]: *** [scm_cred_recv.o] Error 1
看来部分文件出错了,可能是作者没注意,我们帮他改过来吧。
sockets目录下的好多文件的布尔类型声明错了,第三章中讲到了书中的布尔类型引用的是
typedef enum { FALSE, TRUE } Boolean;
这句话被定义在lib\tlpi_hdr.h
里。
我们需要做的就是把所有的false改成FALSE,所有的true改成TRUE,例如:
Boolean useDatagramSocket;
useDatagramSocket = FALSE;
useDatagramSocket = TRUE;
统计了一下所以出错的文件列表如下:
scm_cred_recv.c
scm_cred_send.c
scm_multi_recv.c
scm_multi_send.c
scm_rights_recv.c
scm_rights_send.c
把所有的布尔类型全部换掉就可以成功编译了。
正式开始Linux的学习。
最后,给一个我自己修改后的下载链接:tlpi-191019
更多推荐
所有评论(0)