Le partage de variable globale à partir de la bibliothèque C++ pour le C, le programme principal

0

La question

J'ai gstdsexample.so, une bibliothèque C++. À l'intérieur, il dispose de deux variables globales que j'aimerais partager entre la bibliothèque et le programme C principal.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Test de deux scénarios.

Scénario 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__ */

Inclure sharedata.h dans gstdsexample.cpp et main.c. Compilation OK mais j'obtiens une erreur de segmentation lors de l' gstdsexample.cpp écrit les données à *ptr.

Scénario 2

Déclarer deux variables dans

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Ensuite déclarer que extern dans main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Maintenant, j'ai pas défini d'erreurs de référence pour les deux variables lors de la compilation main.c.

Scénario 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__ */

Ensuite inclure sharedata.h dans gstdsexample.cpp et main.c. Compilation pour le rpc lib est bien. Mais la compilation pour principal.c a des erreurs comme

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));

Comment partager des variables entre C++ et C source des fichiers?

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

La meilleure réponse

1

dans un fichier d'en-tête... 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

dans gstdsexamle.c

#include "gstdsexamle.h"

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

dans la principale.c

#include "gstdsexamle.h"

C'est tout ce dont vous avez besoin. mutex & ptr sont maintenant disponibles dans principaux.rpc/main.c

2021-11-24 04:47:45

gstdsexample lib est bien. Mais principal.c est pas défini des erreurs comme "undefined reference to mutex et undefined reference to ptr"
batuman

J'ai aussi besoin de le déclarer dans le main.c pthread_mutex_t mutex; int *ptr;
batuman
0

Le scénario 1 et le scénario 2 ne sont pas valides parce que le C++ mangles les noms de C++ identificateurs afin de permettre l'identificateur de la surcharge.

Scénario 3 échoue parce que l' extern "C" { } constructeur est une construction syntaxique valable uniquement en C++ et il n'est pas légal dans C. Pour être capable de faire cela, vous devez analyser

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

pour indiquer au compilateur C++ qu'ils sont les variables à compatibilized avec appel C schéma.

Mais le langage C n'est pas au courant de quelque chose qui vient d'une autre langue, donc en C, ces déclarations doivent être:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

dans le fichier d'en-tête, mais sans la syntaxe non valide.

Une approche a été exposé dans anotheer réponse, donc je ne vais pas prolonger expliquant ce qui y est dit, juste pour dire que __cplusplus__ macro est définie automatiquement par le compilateur lorsqu'il agit comme un compilateur C++, de sorte que peut être utilisé comme dans l'autre réponse à permettre le fichier d'en-tête pour partager le C et le C++ déclarations.

2021-11-25 07:26:38

Dans d'autres langues

Cette page est dans d'autres langues

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