从 C++ 库共享全局变量到 C 主程序
Sharing global variable from C++ library to C main program
我有 gstdsexample.so
,一个 C++ 库。
在内部,它有两个我想在库和主 C 程序之间共享的全局变量。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
测试两个场景。
场景一
sharedata.h
#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
#endif /* __SHARE_DATA_H__ */
在 gstdsexample.cpp
和 main.c
中包含 sharedata.h
。
编译正常,但当 gstdsexample.cpp
将数据写入 *ptr
.
时出现分段错误
场景二
在
中声明两个变量
gstdsexamle.cpp
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
然后在main.c.
中声明为extern
extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;
现在我在编译时对两个变量有未定义的引用错误main.c
。
场景 3:
#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>
extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}
#endif /* __SHARE_DATA_H__ */
然后在gstdsexample.cpp
和main.c
中包含sharedata.h
。
为 cpp lib 编译很好。
但是编译 main.c 有错误
error: expected identifier or ‘(’ before string constant
extern "C" {
^~~
deepstream_app_main.c: In function ‘all_bbox_generated’:
deepstream_app_main.c:98:24: error: ‘mutex’ undeclared (first use in this function); did you mean ‘GMutex’?
pthread_mutex_lock( &mutex );
^~~~~
GMutex
deepstream_app_main.c:98:24: note: each undeclared identifier is reported only once for each function it appears in
deepstream_app_main.c:101:21: error: ‘ptr’ undeclared (first use in this function); did you mean ‘puts’?
printf("%d ", *(ptr+x));
如何在 C++ 和 C 源文件之间共享变量?
在头文件中...gstdsexamle.h
// disable name mangling in C++
#ifdef __cplusplus
extern "C" {
#endif
// declare your two vars in the header file as extern.
extern pthread_mutex_t mutex;
extern int *ptr;
#ifdef __cplusplus
}
#endif
在gstdsexamle.c
#include "gstdsexamle.h"
/* only initialise here */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
在main.c
#include "gstdsexamle.h"
这就是您所需要的。 mutex 和 ptr 现在在 main.cpp/main.c
中可用
场景 1 和场景 2 无效,因为 C++ 破坏了 C++ 标识符的名称以允许标识符重载。
场景 3 失败,因为 extern "C" { }
构造函数是一种句法构造,仅在 C++ 中有效,在 C 中是不合法的。要做到这一点,您需要解析
extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}
指示 C++ 编译器它们是要与 C 调用模式兼容的变量。
但 C 语言无法识别来自其他语言的内容,因此在 C 中,这些声明必须显示为:
extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;
在头文件中,但没有无效语法。
在另一个答案中已经暴露了一种方法,所以我不会扩展解释那里说的内容,只是说__cplusplus__
宏是编译器在作为C++编译器时自动定义的,这样就可以像其他答案一样使用,以允许头文件共享 C 和 C++ 声明。
我有 gstdsexample.so
,一个 C++ 库。
在内部,它有两个我想在库和主 C 程序之间共享的全局变量。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
测试两个场景。
场景一
sharedata.h
#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
#endif /* __SHARE_DATA_H__ */
在 gstdsexample.cpp
和 main.c
中包含 sharedata.h
。
编译正常,但当 gstdsexample.cpp
将数据写入 *ptr
.
场景二
在
中声明两个变量gstdsexamle.cpp
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
然后在main.c.
extern
extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;
现在我在编译时对两个变量有未定义的引用错误main.c
。
场景 3:
#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>
extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}
#endif /* __SHARE_DATA_H__ */
然后在gstdsexample.cpp
和main.c
中包含sharedata.h
。
为 cpp lib 编译很好。
但是编译 main.c 有错误
error: expected identifier or ‘(’ before string constant
extern "C" {
^~~
deepstream_app_main.c: In function ‘all_bbox_generated’:
deepstream_app_main.c:98:24: error: ‘mutex’ undeclared (first use in this function); did you mean ‘GMutex’?
pthread_mutex_lock( &mutex );
^~~~~
GMutex
deepstream_app_main.c:98:24: note: each undeclared identifier is reported only once for each function it appears in
deepstream_app_main.c:101:21: error: ‘ptr’ undeclared (first use in this function); did you mean ‘puts’?
printf("%d ", *(ptr+x));
如何在 C++ 和 C 源文件之间共享变量?
在头文件中...gstdsexamle.h
// disable name mangling in C++
#ifdef __cplusplus
extern "C" {
#endif
// declare your two vars in the header file as extern.
extern pthread_mutex_t mutex;
extern int *ptr;
#ifdef __cplusplus
}
#endif
在gstdsexamle.c
#include "gstdsexamle.h"
/* only initialise here */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
在main.c
#include "gstdsexamle.h"
这就是您所需要的。 mutex 和 ptr 现在在 main.cpp/main.c
中可用场景 1 和场景 2 无效,因为 C++ 破坏了 C++ 标识符的名称以允许标识符重载。
场景 3 失败,因为 extern "C" { }
构造函数是一种句法构造,仅在 C++ 中有效,在 C 中是不合法的。要做到这一点,您需要解析
extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}
指示 C++ 编译器它们是要与 C 调用模式兼容的变量。
但 C 语言无法识别来自其他语言的内容,因此在 C 中,这些声明必须显示为:
extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;
在头文件中,但没有无效语法。
在另一个答案中已经暴露了一种方法,所以我不会扩展解释那里说的内容,只是说__cplusplus__
宏是编译器在作为C++编译器时自动定义的,这样就可以像其他答案一样使用,以允许头文件共享 C 和 C++ 声明。