Partilha variável global a partir da biblioteca C++ para C programa principal

0

Pergunta

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?

c++ global-variables
2021-11-24 03:54:36
2

Melhor resposta

1

em um arquivo de cabeçalho... 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

em gstdsexamle.c

#include "gstdsexamle.h"

/* only initialise here */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

no principal.c

#include "gstdsexamle.h"

Isso é tudo o que você precisa. mutex & ptr estão agora disponíveis na principal.cpp/principal.c

2021-11-24 04:47:45

gstdsexample lib é bom. Mas o principal.c tem indefinido erros como `undefined reference (referência indefinida a exclusão mútua e indefinida de referência para ptr'
batuman

Eu também precisa declarar isso no principal.c pthread_mutex_t mutex; int *ptr;
batuman
0

Cenário 1 e cenário 2 são inválidos porque C++ desfigurou os nomes do C++ identificadores para permitir identificador de sobrecarga.

Cenário 3 falha porque o extern "C" { } construtor é uma construção sintática válido apenas em C++ e não é legal em C. Para ser capaz de fazer isso, você precisa analisar

extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}

para indicar o compilador C++ que eles são variáveis a serem compatibilized com C de chamada de esquema.

Mas a linguagem C não está ciente de algo que vem de um idioma diferente assim, em C, dessas declarações deve aparecer como:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

no arquivo de cabeçalho, mas sem o erro de sintaxe.

Uma abordagem que tem sido exposto em anotheer resposta, por isso não vou estender explicando o que é dito lá, só para dizer que __cplusplus__ macro é definida pelo compilador automaticamente quando ele está agindo como um compilador de C++, de modo que pode ser usado como no outro a resposta para permitir que o arquivo de cabeçalho para compartilhar C e C++ declarações.

2021-11-25 07:26:38

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................