Linux C/C++编程:unix网络编程卷二环境搭建

  1. 编译原书所带例子:
wget http://www.kohala.com/start/unpv22e/unpv22e.tar.gz
  1. 解压:
tar -zxvf unpv22e.tar.gz
  1. 编译:
$cd unpv22e
$ ./configure
$ cd lib
$ make

gcc -g -O2 -D_REENTRANT -Wall -D_POSIX_PTHREAD_SEMANTICS -c -o daemon_inetd.o daemon_inetd.c
  In file included from /usr/include/netinet/in.h:23,
  from /usr/include/rpc/types.h:90,
  from /usr/include/rpc/rpc.h:41,
  from unpipc.h:115,
  from daemon_inetd.c:1:
  /usr/include/stdint.h:49: 错误:重复的 'unsigned'
  /usr/include/stdint.h:49: 错误:声明指定了两个以上的数据类型
  /usr/include/stdint.h:50: 错误:重复的 'unsigned'
  /usr/include/stdint.h:50: 错误:重复的 'short'
  /usr/include/stdint.h:52: 错误:重复的 'unsigned'
  /usr/include/stdint.h:52: 错误:声明指定了两个以上的数据类型
  make: *** [daemon_inetd.o] 错误 1

解决方法: unpipc.h中把115内容注释掉。再次编译。

$ make
gcc -g -O2 -D_REENTRANT -Wall -D_POSIX_PTHREAD_SEMANTICS   -c -o daemon_inetd.o daemon_inetd.c
In file included from daemon_inetd.c:1:0:
unpipc.h:479:1: 错误:未知的类型名‘CLIENT’
 CLIENT *Clnt_create(const char *, u_long, u_long, const char *);
 ^
unpipc.h:480:20: 错误:未知的类型名‘CLIENT’
 void  Clnt_control(CLIENT *, u_int, char *);
                    ^
make: *** [daemon_inetd.o] 错误 1

解决方法: 把unpipc.h中第479,480行注释掉。再次编译。

$ make
wrapsunrpc.c:3:1: 错误:未知的类型名‘CLIENT’
 CLIENT *
 ^
wrapsunrpc.c: 在函数‘Clnt_create’中:
wrapsunrpc.c:6:2: 错误:未知的类型名‘CLIENT’
  CLIENT *cl;
  ^
wrapsunrpc.c:8:2: 警告:隐式声明函数‘clnt_create’ [-Wimplicit-function-declaration]
  if ( (cl = clnt_create(host, prog, vers, proto)) == NULL) {
  ^
wrapsunrpc.c:8:11: 警告:赋值时将整数赋给指针,未作类型转换 [默认启用]
  if ( (cl = clnt_create(host, prog, vers, proto)) == NULL) {
           ^
wrapsunrpc.c:9:3: 警告:隐式声明函数‘clnt_pcreateerror’ [-Wimplicit-function-declaration]
   clnt_pcreateerror(host);
   ^
wrapsunrpc.c: 在文件作用域:
wrapsunrpc.c:16:14: 错误:未知的类型名‘CLIENT’
 Clnt_control(CLIENT *cl, u_int req, char *ptr)
              ^
make: *** [wrapsunrpc.o] 错误 1

解决:修改unpv22e/Make.defines中的LIB_OBJS的".o"文件,删除"wrapsunrpc.o"。
在这里插入图片描述

$ make
$ cd unp22e

$ mv config.h ipcconfig.h

$ vi pipe/unpipc.h

/*unpipc.h修改内容*/

#include "ipcconfig.h"

复制libunpipc.a ipcconfig.h unpipc.h

$ sudo cp ipcconfig.h pipe/unpipc.h /usr/include
$ sudo cp libunpipc.a /usr/lib

测试是否搭建成功

方法1. 运行官方例子

cd pipe
 gcc mainpipe.c server.c client.c -lunpipc -lrt -lpthread  -o mainpipe.out

方法2:编写如下程序

#include "unpipc.h"

int main(int argc,char ** argv)

{

    int i, msqid;
    for (i = 0; i < 10; i++) {
        msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
        printf("msqid = %d\n", msqid);
        Msgctl(msqid, IPC_RMID, NULL);
    }

     exit(0);

}

编译运行:

gcc -o test main.c -lunpipc -pthread -lrt

在这里插入图片描述

clion怎么编写:
在这里插入图片描述

cmake_minimum_required(VERSION 3.16)
SET(CMAKE_C_COMPILER /usr/bin/gcc)
project(THREAD)
add_executable(THREAD main.c)
TARGET_LINK_LIBRARIES(${PROJECT_NAME}   -lrt -lpthread  unpipc)
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
  • 注意一定要以.c结尾而不是.cpp结尾,否则会报错
CMakeFiles/THREAD.dir/main.cpp.o:在函数‘main’中:
/home/oceanstar/CLionProjects/THREAD/main.cpp:8:对‘Msgget(int, int)’未定义的引用
/home/oceanstar/CLionProjects/THREAD/main.cpp:10:对‘Msgctl(int, int, msqid_ds*)’未定义的引用
collect2: 错误:ld 返回 1

第二种编译方法
参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值