最近在弄一个进程间通信,原始测试demon用c语言写的,经过测试ok,然后把接口封装起来了一个send,一个recv。
使用的时候send端是在一个c语言写的http服务端使用,编译ok没有报错,但是recv的使用在QT里面是C++的,编译的时候出现
undefined reference to `recvIpcMsg(int, ipc_msg*)‘
报错。
检查了头文件和实现文件都在,编译成动态库了都,同样的方法在C文件里调用都没有报错,搬到C++里面就都报错了,突然想起来一件事我的头文件声明没有对C++编译器专门处理。
如下:
/**ipcmsg.h */ #ifndef H_MSGIPC_H #define H_MSGIPC_H
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 8888 #define BUF_SIZE 64 typedef enum ipc_msg_type { APP_MSG, INPUT_MSG, GPS_MSG }ipc_type; typedef struct msgIpc { ipc_type type; char buf[BUF_SIZE]; }ipc_msg_t; //send ipc msg extern int sendIpcMsg(key_t msgkey, const ipc_msg_t *msg); //recv ipc msg extern int recvIpcMsg(key_t msgkey, ipc_msg_t *msg); #endif
如果C的方法要在C++编译器里链接使用应该加上如下宏包含
#ifdef __cplusplusextern "C" { #endif #ifdef __cplusplus } #endif
如此才能正常编译链接。
最后修改如下就可以编过了
/* *ipcmsg.h */ #ifndef H_MSGIPC_H #define H_MSGIPC_H
#ifdef __cplusplusextern "C" { #endif
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
typedef enum ipc_msg_type { APP_MSG, INPUT_MSG, GPS_MSG }ipc_type; typedef struct msgIpc { ipc_type type; char buf[BUF_SIZE]; }ipc_msg_t; //send ipc msg extern int sendIpcMsg(key_t msgkey, const ipc_msg_t *msg); //recv ipc msg extern int recvIpcMsg(key_t msgkey, ipc_msg_t *msg);
#ifdef __cplusplus } #endif
#endif
undefined reference to `recvIpcMsg(int, ipc_msg*)'——#ifdef __cplusplus extern "C" { #endif
原文地址:https://www.cnblogs.com/tid-think/p/9272218.html
时间: 2024-10-06 15:33:39