zoukankan      html  css  js  c++  java
  • Unix NetWork Programming(unix环境编程)——环境搭建(解决unp.h等源码编译问题)

    此配置实例亲测成功,共勉,有问题大家留言。

    环境:VMware 10 + unbuntu 14.04

    为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和apue.h差不多,不过这里需要编译源代码,为了以后方便,现在整理如下:

    主要有两点一是生成libunp.a这个库,二是得到unp.h、config.h这两个个头文件。

    1,安装编译器,为了齐全还是安装一下build-essential

    1. sudo apt-get install build-essential  

    2,下载本书的头文件及示例源码

    unpv12e.tar.gz(这个编译有问题)unpv13e.tar.gz下不了,可以google一下。

    (下载使用unpv13e的话,3中解决问题的地方就可以略过了)

    3,解压unpv12e.tar.gz后进入目录查看README,然后可以按照里面提示操作,不过会遇到问题

    第一步:在终端中进入upnv12e目录,然后执行代码: 

    1. ./configure   

    第二步:这里有问题及解决方法

    1. cd lib  

         2.make  //这一步出错了  

    错误代码为:

    1. gcc -g -O2 -D_REENTRANT -Wall   -c -o connect_nonb.o connect_nonb.c  
    2. In file included from connect_nonb.c:1:  
    3. unp.h:114: error: redefinition of ‘struct in_pktinfo’  
    4. make: *** [connect_nonb.o] 错误 1  

    redefinition of ‘struct in_pktinfo’的解决方法如下: 

    结构in_pktinfo已经包含在标准头文件bits/in.h中了, 它又通过 netinet/in.h 在unp.h中被包括进来. 只要将 unp.h 中的结构定义comment out注释掉就行了. 

    注释掉之后重新

    1. make //build the basic library that all programs need   

    这次就成功了!生成了../libunp.a文件。 

    第三步:这一步没有问题

    1. cd ../libfree  # continue building the basic library  
    2. make   
    第四步:这步解决方法麻烦一点
    1. cd ../libgai   # the getaddrinfo() and getnameinfo() functions  
    2. make  
    错误提示如下:
    1. gcc -g -O2 -D_REENTRANT -Wall   -c -o getaddrinfo.o getaddrinfo.c  
    2. getaddrinfo.c: In function ‘getaddrinfo’:  
    3. getaddrinfo.c:58: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function)  
    4. getaddrinfo.c:58: error: (Each undeclared identifier is reported only once  
    5. getaddrinfo.c:58: error: for each function it appears in.)  
    6. getaddrinfo.c:116: error: ‘EAI_NODATA’ undeclared (first use in this function)  
    7. make: *** [getaddrinfo.o] 错误 1  

    解决方法如下:

     回到unpv12e目录: 

    1. cd ..  
    2. gedit configure.in   
    找到下面一行注释掉
    LIBGAI_OBJS="getaddrinfo.o getnameinfo.o freeaddrinfo.o gai_strerror.o"
    然后用下面的代码代替注释掉的那行 
    1. LIBGAI_OBJS=
    2. if test "$ac_cv_func_getaddrinfo" = no ; then
    3. LIBGAI_OBJS="$LIBGAI_OBJS getaddrinfo.o"
    4. fi
    5. if test "$ac_cv_func_getnameinfo" = no ; then
    6. LIBGAI_OBJS="$LIBGAI_OBJS getnameinfo.o"
    7. fi
    8. if test "$ac_cv_func_freeaddrinfo" = no ; then
    9. LIBGAI_OBJS="$LIBGAI_OBJS freeaddrinfo.o"
    10. fi
    11. if test "$ac_cv_func_gai_strerror" = no ; then
    12. LIBGAI_OBJS="$LIBGAI_OBJS gai_strerror.o"
    13. fi
    1. autoconf  
    2. ./configure  
    1. gedit Make.defines   
    在文件末尾加上下面这句:
    CFLAGS = -g -O2 -D_REENTRANT -Wall -D_GNU_SOURCE

    然后重新执行代码:

    1. cd libgai  # continue building the basic library  
    2. make  

    ok,问题解决了!

    4,将生成的libunp.a静态库复制到/usr/lib/和/usr/lib64/中。

    1. cd ..   //回到unpv12e目录  
    1. sudo cp libunp.a /usr/lib  
    2. sudo cp libunp.a /usr/lib64  

    5,修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便

    1. gedit lib/unp.h   //将unp.h中#include "../config.h"修改为#include "config.h"  
    1. sudo cp lib/unp.h /usr/include  
    2. sudo cp config.h /usr/include  

    6,编译源代码

    1. cd 你的程序目录  
    2. gcc daytimetcpcli.c -o daytimetcpcli -lunp  

    跟普通的编译不一样的是要在最后加上刚才那个链接库,-l参数加上刚才那个libunp.a去掉lib和后面的.a。最后得到参数-lunp。

    7,编写程序

    以后编写完的程序安装6中的代码编译就行了,然后代码可以完全跟书上的一样。代码编辑器或IDE等就按自己的喜好来选了。这个网上很多c语言编程环境搭建教程。

    我选择命令行用vim来编写程序,主要为了锻炼一下自己。

    现在借鉴网上的,自己测试成功,后来有问题,我会陆续补上来,跟大家分享。

  • 相关阅读:
    nodejs处理get请求
    ubuntu中chromium无法播放flash,安装flash
    JQuery日历控件
    深度理解Jquery 中 offset() 方法
    javascrip中parentNode和offsetParent之间的区别
    JQuery判断元素是否存在
    javascript日历控件——纯javascript版
    canvas作为背景
    background-position控制背景位置
    javascript日历控件
  • 原文地址:https://www.cnblogs.com/zCoderJoy/p/4072365.html
Copyright © 2011-2022 走看看