记录一次搭建unix网络编程环境过程中遇到的问题和总结 计算机环境虚拟机 linuxmint-18-xfce-64bit 1.打开unix网络编程.iso
2. s@ss-Linux ~/unix/unpv13e $ sudo su [sudo] s 的密码: ss-Linux unpv13e # ./configure checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for gcc... gcc checking for C compiler default output... configure: error: C compiler cannot create executables See `config.log' for more details. 很明显在检测环境时gcc无法生成可执行文件。
3.突发奇想,编译器出现问题,不如换个编译器。 s-Linux unpv13e # apt-get install g++ 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同时安装下列软件: binutils cpp-5 g++-5 gcc-5 gcc-5-base gcc-5-base:i386 libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgfortran3 libgomp1 libitm1 liblsan0 libmpx0 libquadmath0 libstdc++-5-dev libstdc++6:i386 libstdc++6 libtsan0 libubsan0 建议安装: binutils-doc gcc-5-locales g++-multilib g++-5-multilib gcc-5-doc libstdc++6-5-dbg gcc-5-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan2-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg glibc-doc libstdc++-5-doc 下列【新】软件包将被安装: g++ g++-5 libc-dev-bin libc6-dev libstdc++-5-dev 下列软件包将被升级: binutils cpp-5 gcc-5 gcc-5-base gcc-5-base:i386 libasan2 libatomic1 libcc1-0 libcilkrts5 libgcc-5-dev libgfortran3 libgomp1 libitm1 liblsan0 libmpx0 libquadmath0 libstdc++6:i386 libstdc++6 libtsan0 libubsan0 。。。。。。。。(略) 上面可以看到gcc等,希望有用。
4.再次执行configure
View Code
5.明显通过检测生成了 Makefile Make.defines config.h
6.根据readme的指示,编译库文件
View Code
7.编译库文件 ss-Linux lib # cd ../libfree ss-Linux libfree # make gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o in_cksum.o in_cksum.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_ntop.o inet_ntop.c inet_ntop.c: In function ‘inet_ntop’: inet_ntop.c:60:9: error: argument ‘size’ doesn’t match prototype size_t size; ^ In file included from inet_ntop.c:27:0: /usr/include/arpa/inet.h:64:20: error: prototype declaration extern const char *inet_ntop (int __af, const void *__restrict __cp, ^ <builtin>: recipe for target 'inet_ntop.o' failed make: *** [inet_ntop.o] Error 1 错误原因可以看出是 ANSCI创造了size_t数据类型,它用作malloc的唯一参数(待分配的字节数),或者作为read和write的第三个参数(待读写的字节数)。在32位系统中,size_t是一个32位值,但是64位系统中它必须是一个64位值,以便发挥更大寻址模型的优势。这意味着64位系统中也许含有一个把size_t定义为unsigned long的typedef指令。联网API存在如下问题:POSIX.1g的某些草案规定,存放套接字的地址结构大小的函数参数具有size_t的数据类型(如bind和connect的第三个参数)。某些XTI结构也含有数据类型为long的成员(如t_info和t_opthdr结构)。如果这些规定不加修改,当unix从ILP32模型转为LP64模型时,size_t和long都将从32位变成64位值,这两个列子实际上并不需要使用64的数据类型:套接字的地址结构的长度最多也就几百个字节,给XTI的结构成员使用long数据类型是个错误。 我的电脑是64位。 解决办法 8.重新编译 ss-Linux libfree # make gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_ntop.o inet_ntop.c /usr/include/arpa/inet.h: In function ‘inet_ntop’: inet_ntop.c:152:23: warning: ‘best.len’ may be used uninitialized in this function [-Wmaybe-uninitialized] if (best.base == -1 || cur.len > best.len) ^ inet_ntop.c:123:28: note: ‘best.len’ was declared here struct { int base, len; } best, cur; ^ gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_pton.o inet_pton.c ar rv ../libunp.a in_cksum.o inet_ntop.o inet_pton.o a - in_cksum.o a - inet_ntop.o a - inet_pton.o ranlib ../libunp.a
9.路由套接字 库 ss-Linux libfree # cd ../libroute ss-Linux libroute # make gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o get_rtaddrs.o get_rtaddrs.c In file included from get_rtaddrs.c:1:0: unproute.h:3:45: fatal error: net/if_dl.h: 没有那个文件或目录 compilation terminated. <builtin>: recipe for target 'get_rtaddrs.o' failed make: *** [get_rtaddrs.o] Error 1 又出错了, Please note, you DO NOT need to make in that folder "libroute" See the Document: cd ../libroute # only if your system supports 4.4BSD style routing sockets make # only if your system supports 4.4BSD style routing sockets cd ../libxti # only if your system supports XTI make # only if your system supports XTI Linux is not BSD style routing, just go to ../intro and build examples~! 好吧,编译到此结束。
10.打开lib目录
11.返回unpv13e文件夹 ss-Linux unpv13e # cp config.h /usr/local/include ss-Linux unpv13e # cp lib/unp.h /usr/local/include ss-Linux unpv13e # sudo cp libunp.a /usr/local/lib ss-Linux unpv13e # cd intro
ss-Linux intro # gcc daytimetcpcli.c -o 获取时间 /tmp/cciq4Jvt.o:在函数‘main’中: daytimetcpcli.c:(.text+0x3b):对‘err_quit’未定义的引用 daytimetcpcli.c:(.text+0x6d):对‘err_sys’未定义的引用 daytimetcpcli.c:(.text+0xe5):对‘err_quit’未定义的引用 daytimetcpcli.c:(.text+0x114):对‘err_sys’未定义的引用 daytimetcpcli.c:(.text+0x153):对‘err_sys’未定义的引用 daytimetcpcli.c:(.text+0x196):对‘err_sys’未定义的引用 collect2: error: ld returned 1 exit status
又错。。。。。 有个makefile,make,make,make编译成功。[上面的问题,第二天解决了,请翻到最后。初学者很无奈。。。。。。。 ss-Linux intro # make gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli.o daytimetcpcli.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli daytimetcpcli.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli1.o daytimetcpcli1.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli1 daytimetcpcli1.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli2.o daytimetcpcli2.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli2 daytimetcpcli2.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli3.o daytimetcpcli3.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli3 daytimetcpcli3.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv.o daytimetcpsrv.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv daytimetcpsrv.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv1.o daytimetcpsrv1.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv1 daytimetcpsrv1.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv2.o daytimetcpsrv2.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv2 daytimetcpsrv2.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv3.o daytimetcpsrv3.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv3 daytimetcpsrv3.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcliv6.o daytimetcpcliv6.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcliv6 daytimetcpcliv6.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrvv6.o daytimetcpsrvv6.c gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrvv6 daytimetcpsrvv6.o ../libunp.a -lpthread gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o byteorder.o byteorder.c byteorder.c: In function ‘main’: byteorder.c:21:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=] printf("sizeof(short) = %d\n", sizeof(short)); ^ gcc -I../lib -g -O2 -D_REENTRANT -Wall -o byteorder byteorder.o ../libunp.a -lpthread 成功!
ss-Linux intro # ./daytimetcpcli 127.0.0.1 connect error: Connection refused 又出错。。。 继续上搜索引擎
13.安装xinetd ss-Linux intro # apt-get install xinetd 具体请百度,不作解释。
14.启用daytime服务 service xinetd restart
15.再次测试 ss-Linux intro # ./daytimetcpcli 127.0.0.1 13 AUG 2016 20:39:16 CST 成功!!!
12.1.关于单独编译daytimetcpcli.c出错的原因 解决加入libunp.a库 ss-Linux intro # gcc daytimetcpcli.c -o 获取时间 -lunp ss-Linux intro # ./获取时间 127.0.0.1 14 AUG 2016 08:20:15 CST
感想: 1.花费了两天时间终于粗略的把环境搭建好了,想深入学习,深刻感受到基础知识的重要性。没有系统学习过linux,make命令等等,非常吃力。遇到问题,都不知道如何搜索问题,只能把错误信息粘贴到搜索引擎上,盲目的搜索。 2.眼高手低 3.对于帮助文档一定要好好看,不要什么一上来就去搜索引擎上去寻找答案。 4.第二次搭建环境了,第一次乱七八糟弄好也遇到很多问题没解决,这一次基本上都解决了。以后应认真学习努力加油!
最后,写的有些仓促,肯定存在一些细节错误或者没写出来,假如你看到了请指出来,有问题一起来讨论。后续我会继续修改文章的。 转载请注明出处。谢谢。
|
|
来自: just_person > 《待分类》