Eu gstdsexample.so
, uma biblioteca C++.
Dentro, ele tem duas variáveis globais que eu gostaria de compartilhar, entre a biblioteca e a C principal do programa.
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
Teste os dois cenários.
Cenário 1
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__ */
Incluem sharedata.h
no gstdsexample.cpp
e main.c
.
Compilação OK, mas eu recebo um erro de falha de segmentação quando gstdsexample.cpp
escreve dados para *ptr
.
Cenário 2
Declaramos duas variáveis
gstdsexamle.cpp
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
Em seguida, declarar como extern
no main.c.
extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;
Agora eu tenho erros de undefined reference (referência indefinida para as duas variáveis ao compilar main.c
.
Cenário 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__ */
Em seguida, incluir sharedata.h
no gstdsexample.cpp
e main.c
.
A compilação para cpp lib é bom.
Mas a compilação principal.c tem erros como
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));
Como compartilhar variáveis entre C++ e arquivos de origem C?