我正在开发一个实现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 ++代码兼容的东西。
答案 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; }