如何在C和C++代码之间共享变量

How do I share variables between C and C++ code?

本文关键字:代码 之间 共享变量 C++      更新时间:2023-10-16

我正在开发一个实现C代码的C++项目,但遇到了分段错误。当我试图访问C++代码中的全局C变量时,会出现segfault。

代码概述:
我有一个名为video_stage.c的c文件,其中包含以下代码片段:

#include "video_stage.h"
uint8_t*  pixbuf_data = NULL;    //pointer to video buffer
vp_os_mutex_t  video_update_lock = PTHREAD_MUTEX_INITIALIZER;  
C_RESULT output_gtk_stage_transform( void *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
{
   vp_os_mutex_lock(&video_update_lock);
   /* Get a reference to the last decoded picture */
   pixbuf_data      = (uint8_t*)in->buffers[0];
   vp_os_mutex_unlock(&video_update_lock);
   return (SUCCESS);
}

此函数由其他C代码周期性调用,并更新指向RGB视频帧的pixbuf_data指针。

这是头文件video_stage.h:

#ifndef _IHM_STAGES_O_GTK_H
#define _IHM_STAGES_O_GTK_H
#ifdef __cplusplus
extern "C" {
#endif
#include <config.h>
#include <VP_Api/vp_api_thread_helper.h>
#include <VP_Api/vp_api.h>                  //hier zit vp_os_mutex in geinclude
PROTO_THREAD_ROUTINE(video_stage, data);
#ifdef __cplusplus
}
#endif
extern uint8_t*  pixbuf_data;
extern vp_os_mutex_t  video_update_lock;
#endif // _IHM_STAGES_O_GTK_H

头文件包含pixbuf_data指针的外部声明。

这里是cpp文件:device.cc:

#include <iostream>
#include "video_stage.h"
int ardrone_update(ardrone_t *d)
{
    uint8_t x;
    x = pixbuf_data[0];            //no problem here, this is executed
    std::cout << 5 << std::endl;   //this is executed too
    std::cout << x << std::endl;   //segfault occures here
}

当(由其他cpp代码)调用cpp文件中的函数时,在打印x.的cout指令处会发生segfault

当我对c文件中缓冲区的第一个元素进行printf时,我得到了我所期望的。

我确信这与c和c++代码的混合有关,但根据我的研究,我已经做了一些事情,使c和c++的代码在这里兼容。

在C++代码中,在C源中定义的pixbuf_data必须用C链接声明:

extern "C" uint8_t*  pixbuf_data;

如果没有extern "C",C++代码就不能链接,除非存在具有C++链接的pixbuf_data的另一个(重复的)定义。

给自己一个调试器,并在它下运行程序。跟踪代码根本不会告诉您segfault出现在哪里,IO很慢。

在您向我们展示的代码中,您似乎没有为pixbuf_data分配内存。当你访问它而不给它分配一个有效的指针时,任何事情都可能发生。

我正在尝试在C项目和C++项目之间共享变量。但当我构建解决方案时,我得到了"错误LNK2001:未解析的外部符号"struct-configurationg_conf

===在C项目中===

我创建了一个头文件,并在上面创建了我的结构

typedef struct{ int maxUser; }Configuration;
extern Configuration conf;

======在C++项目中======

在主文件中:

#include "../ProjectC/header.h"
int main(){ conf.maxUser = 10; }