- 编译原书所带例子:
wget http://www.kohala.com/start/unpv22e/unpv22e.tar.gz
- 解压:
tar -zxvf unpv22e.tar.gz
- 编译:
$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