此配置实例亲测成功,共勉,有问题大家留言。
环境:VMware 10 + unbuntu 14.04
为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和apue.h差不多,不过这里需要编译源代码,为了以后方便,现在整理如下:
主要有两点一是生成libunp.a这个库,二是得到unp.h、config.h这两个个头文件。
1,安装编译器,为了齐全还是安装一下build-essential
- sudo apt-get install build-essential
2,下载本书的头文件及示例源码
unpv12e.tar.gz(这个编译有问题)unpv13e.tar.gz下不了,可以google一下。
(下载使用unpv13e的话,3中解决问题的地方就可以略过了)
3,解压unpv12e.tar.gz后进入目录查看README,然后可以按照里面提示操作,不过会遇到问题
第一步:在终端中进入upnv12e目录,然后执行代码:
- ./configure
第二步:这里有问题及解决方法
- cd lib
2.make //这一步出错了
错误代码为:
- gcc -g -O2 -D_REENTRANT -Wall -c -o connect_nonb.o connect_nonb.c
- In file included from connect_nonb.c:1:
- unp.h:114: error: redefinition of ‘struct in_pktinfo’
- make: *** [connect_nonb.o] 错误 1
redefinition of ‘struct in_pktinfo’的解决方法如下:
结构in_pktinfo已经包含在标准头文件bits/in.h中了, 它又通过 netinet/in.h 在unp.h中被包括进来. 只要将 unp.h 中的结构定义comment out注释掉就行了.
注释掉之后重新
- make //build the basic library that all programs need
这次就成功了!生成了../libunp.a文件。
第三步:这一步没有问题
第四步:这步解决方法麻烦一点
- cd ../libfree # continue building the basic library
- make
错误提示如下:
- cd ../libgai # the getaddrinfo() and getnameinfo() functions
- make
- gcc -g -O2 -D_REENTRANT -Wall -c -o getaddrinfo.o getaddrinfo.c
- getaddrinfo.c: In function ‘getaddrinfo’:
- getaddrinfo.c:58: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function)
- getaddrinfo.c:58: error: (Each undeclared identifier is reported only once
- getaddrinfo.c:58: error: for each function it appears in.)
- getaddrinfo.c:116: error: ‘EAI_NODATA’ undeclared (first use in this function)
- make: *** [getaddrinfo.o] 错误 1
解决方法如下:
回到unpv12e目录:
找到下面一行注释掉
- cd ..
- gedit configure.in
LIBGAI_OBJS="getaddrinfo.o getnameinfo.o freeaddrinfo.o gai_strerror.o"
然后用下面的代码代替注释掉的那行
- LIBGAI_OBJS=
- if test "$ac_cv_func_getaddrinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS getaddrinfo.o"
- fi
- if test "$ac_cv_func_getnameinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS getnameinfo.o"
- fi
- if test "$ac_cv_func_freeaddrinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS freeaddrinfo.o"
- fi
- if test "$ac_cv_func_gai_strerror" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS gai_strerror.o"
- fi
- autoconf
- ./configure
在文件末尾加上下面这句:
- gedit Make.defines
CFLAGS = -g -O2 -D_REENTRANT -Wall -D_GNU_SOURCE
然后重新执行代码:
- cd libgai # continue building the basic library
- make
ok,问题解决了!
4,将生成的libunp.a静态库复制到/usr/lib/和/usr/lib64/中。
- cd .. //回到unpv12e目录
- sudo cp libunp.a /usr/lib
- sudo cp libunp.a /usr/lib64
5,修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便
- gedit lib/unp.h //将unp.h中#include "../config.h"修改为#include "config.h"
- sudo cp lib/unp.h /usr/include
- sudo cp config.h /usr/include
6,编译源代码
- cd 你的程序目录
- gcc daytimetcpcli.c -o daytimetcpcli -lunp
跟普通的编译不一样的是要在最后加上刚才那个链接库,-l参数加上刚才那个libunp.a去掉lib和后面的.a。最后得到参数-lunp。
7,编写程序
以后编写完的程序安装6中的代码编译就行了,然后代码可以完全跟书上的一样。代码编辑器或IDE等就按自己的喜好来选了。这个网上很多c语言编程环境搭建教程。
我选择命令行用vim来编写程序,主要为了锻炼一下自己。
现在借鉴网上的,自己测试成功,后来有问题,我会陆续补上来,跟大家分享。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?