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

时间:2012-03-11 15:27:12

标签: c++ c segmentation-fault

我正在开发一个实现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代码定期调用,并更新pixbuf_data指针指向RGB视频帧。

这是头文件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指针的extern声明。

这里是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指令处发生段错误。

当我在c文件中执行缓冲区的第一个元素的printf时,我得到了我期望的结果。

我确定它与c和c ++代码的混合有关,但根据我的研究,我已经完成了使c和c ++代码兼容的东西。

3 个答案:

答案 0 :(得分:2)

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

extern "C" uint8_t*  pixbuf_data;

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

答案 1 :(得分:1)

让自己成为一个调试器并在其下运行您的程序。跟踪代码根本不告诉您segfault出现的位置,IO很慢。

在您向我们展示的代码中,您似乎没有为pixbuf_data分配内存。如果您在不指定有效指针的情况下访问它,就会发生任何事情。

答案 2 :(得分:0)

我正在尝试在C项目和c ++项目之间共享变量。但是当我构建我的解决方案时,我得到了“错误LNK2001:未解析的外部符号”struct configuration g_conf“。这就是我所做的:

====在C项目中==

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

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

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

在主文件中:

#include "../ProjectC/header.h"

int main(){ conf.maxUser = 10; }