apue.3与unp在Linux上编程环境搭建

导读

在学习Unix高级环境编程与Unix网络编程的时候,按照作者的提示操作即可成功的编译运行这两本书提供的源代码,但是如果自己想想在自己的环境里按照书籍学习,也就是在自己的环境里调用作者封装的api该怎么办呢?很直接的想法是将作者提供的api编译成Linux下的库,然后将需要的头文件和可文件拷贝到系统存放头文件和库文件的位置就可以了,查阅资料之后,成功的在Ubuntu16.04上搭建好了这两本书的运行环境。

软件环境

  • Ubuntu16.04
  • make
  • cmake
  • gcc-5.4.0
  • CLion

搭建apue.3e开发环境

  • 从官网下载apue.3e源代码到本地
  • 解压源文件
    tar -xvf apue.3e.tar.gz
  • 安装依赖libbsd-dev
    sudo apt-get install libbsd-dev
  • 进入在apue.3e目录下执行make命令,会在lib目录下生成libapue.a的库文件
  • 用管理权限将相应的头文件和库文件拷贝到系统目录
cp ./include/apue.h /usr/include
cp ./lib/libapue.a /usr/lib
cp ./lib/error.c /usr/include
  • 测试
#include <apue.h>

int
main(int argc, char *argv[]) {
    printf("process id : %d", getpid());
    exit(0);
}
  • 编译运行
g++ -0 apue_test main.cpp

到此为止,apue.3e的开发环境就搭建好啦,下面我们继续搭建《Unix网络编程》这本书的开发环境!

搭建unp开发环境

  • 从官网下载unpv13e的源代码
  • 解压源代码
    tar -xvf unpv13e.tar.gz
  • 在目录unpe13v下依次执行以下命令编译源代码
./configure
cd lib
make
cd ../libfree
make
cd ../libroute
make // 这一步可能会出错,是因为你的系统不支持4.4BSD,并不影响本书的学习
cd ../libgai
make
cd ..
  • 将生成的libunp.a拷贝至系统库目录
    sudo cp libunp.a /usr/lib
  • 将修改lib/unp.h#include "../config.h"#include "config.h"
  • lib/unp.h以及config.h拷贝至系统头文件目录
sudo cp ./lib/unp.h /usr/include
sudo cp config.h /usr/include
  • 在CLion中创建一个CPP项目测试intro/daytimesrv.c
#include    "unp.h"
#include    <time.h>

int
main(int argc, char **argv)
{
    int                 listenfd, connfd;
    struct sockaddr_in  servaddr;
    char                buff[MAXLINE];
    time_t              ticks;

    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port        = htons(8080); /* daytime server */

    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

    Listen(listenfd, LISTENQ);

    for ( ; ; ) {
        connfd = Accept(listenfd, (SA *) NULL, NULL);

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));

        Close(connfd);
    }
}
  • 编译daytimetcpsrv.c
    gcc -o daytimetcpsrv daytimetcpsrv.c -lunp
  • 运行
    ./daytimetcpsrv

  • 问题
    如果用g++编译运行还是会出错,至今未解决,希望有人解决了可以告知,谢谢啦!

g++ -o daytimesrv daytimetcpsrv.cpp -lunp
/tmp/cc4nI2AN.o: In function `main':
daytimetcpsrv.c:(.text+0x37): undefined reference to `Socket(int, int, int)'
daytimetcpsrv.c:(.text+0x97): undefined reference to `Bind(int, sockaddr const*, unsigned int)'
daytimetcpsrv.c:(.text+0xa9): undefined reference to `Listen(int, int)'
daytimetcpsrv.c:(.text+0xc0): undefined reference to `Accept(int, sockaddr*, unsigned int*)'
daytimetcpsrv.c:(.text+0x133): undefined reference to `Write(int, void*, unsigned long)'
daytimetcpsrv.c:(.text+0x140): undefined reference to `Close(int)'
collect2: error: ld returned 1 exit status
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值