La condivisione di variabile globale da C++ a C programma principale

0

Domanda

Ho gstdsexample.so, una libreria in C++. All'interno, dispone di due variabili globali che vorrei condividere tra la biblioteca e il programma C principale.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Prova due scenari.

Scenario 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__ */

Includono sharedata.h in gstdsexample.cpp e main.c. Compilazione OK, ma ho un segmentation fault gstdsexample.cpp scrive i dati *ptr.

Scenario 2

Dichiarare due variabili in

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Quindi dichiarare come extern in main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Ora ho definito gli errori di riferimento per le due variabili durante la compilazione main.c.

Scenario 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__ */

Quindi includere sharedata.h in gstdsexample.cpp e main.c. La compilazione per cpp lib va bene. Ma la compilazione per la principale.c è da errori

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

Come condividere le variabili tra C e C++ source file?

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

Migliore risposta

1

in un file di intestazione... 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

in gstdsexamle.c

#include "gstdsexamle.h"

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

in main.c

#include "gstdsexamle.h"

Questo è tutto ciò di cui hai bisogno. mutex & ptr sono ora disponibili in main.cpp/main.c

2021-11-24 04:47:45

gstdsexample lib va bene. Ma principale.c indefinito errori come "undefined reference to mutex e undefined reference to ptr"
batuman

Ho anche la necessità di dichiarare il presente nel main.c pthread_mutex_t mutex; int *ptr;
batuman
0

Scenario 1 e scenario 2 non sono validi perché il C++ manipola i nomi del C++ identificatori per consentire l'identificatore di un sovraccarico.

Scenario 3 non riesce perché il extern "C" { } il costruttore è una costruzione sintattica valido solo in C++ e non è legale in C. Per essere in grado di fare questo, è necessario analizzare

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

per indicare il compilatore C++ che sono variabili da compatibilizzare con chiamata C schema.

Ma il linguaggio C non è a conoscenza di qualcosa che proviene da un altra lingua in C, tali dichiarazioni devono essere visualizzato come:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

nel file di intestazione, ma senza la sintassi non valida.

Un approccio che è stato esposto in anotheer risposta, quindi non voglio prolungare spiegando di cosa si dice, solo per dire che __cplusplus__ macro è definita dal compilatore automaticamente quando esso agisce come un compilatore C++, in modo che può essere utilizzato come nell'altra risposta per consentire il file di intestazione quota di C e C++ dichiarazioni.

2021-11-25 07:26:38

In altre lingue

Questa pagina è in altre lingue

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