第一章
第一节
本书的第一个程序,daytimetcpcli.c,在运行时遇到了些问题。首先参考https://blog.csdn.net/u011068702/article/details/60970131配置好了静态库和unp.h文件。运行时出现:
daytimetcpcli.c:(.text+0x4a): undefined reference to `err_quit'
/usr/bin/ld: daytimetcpcli.c:(.text+0x7e): undefined reference to `err_sys'
/usr/bin/ld: daytimetcpcli.c:(.text+0xfa): undefined reference to `err_quit'
/usr/bin/ld: daytimetcpcli.c:(.text+0x12b): undefined reference to `err_sys'
/usr/bin/ld: daytimetcpcli.c:(.text+0x16c): undefined reference to `err_sys'
/usr/bin/ld: daytimetcpcli.c:(.text+0x1b1): undefined reference to `err_sys'
原因是err_quit,err_sys等这些函数都是作者自己定义的函数,并没有在源码里包含。后来才发现这些个函数居然定义在作者的另一本书Advanced Programming in the UNIX® Environment, Third Edition的源码里,源码链接http://www.apuebook.com/code3e.html。
下载之后找到apue.3e/include/apue.h,apue.3e/lib/error.c两个文件,前者是报错函数的声明头文件,后者是实现的文件。然后做以下操作
- 把error.c文件改名为myerr.c。
- 因为报错函数的声明和实现文件的名字不同,直接包含apue.h的话无法链接到实现文件中,所以在apue.h文件最后一行#endif /* _APUE_H */前加入#include “myerr.c”。
- 在unp.h中加入#include “apue.h”。注意要将传到/usr/include里的apue.h替换掉。
- 将apue.h和myerr.c文件都copy到/usr/include中去
大功告成~现在运行g++ daytimetcpcli.c -o daytimetcpcli就可以编译啦
编译完之后运行daytimetcpcli程序,又报错了:
l**@l**-virtual-machine:~/UNIX_network/unpv13e-master/intro$ ./daytimetcpcli 192.168.220.191
connect error: Connection refused
这是由于daytimetcpcli只是一个客户端程序,有个配套的服务器端程序daytimetcpsrv在1.5节…需要先编译运行这个程序,打开服务器端的daytime服务,客户端和服务器端才能通讯。(注意打开服务器端的daytime服务后,因为要保持这个开启状态,所以需要另外开启一个终端来运行客户端的daytimetcpcli程序)
终于出来了!!
l**@l**-virtual-machine:~/UNIX_network/unpv13e-master/intro$ ./daytimetcpcli 192.168.220.191
Fri Jun 19 11:08:33 2020
第一个小程序就遇到不少问题,万事开头难,继续加油吧