Genel değişkeni C ++ kitaplığından C ana programına paylaşma

0

Soru

Ben sahibim gstdsexample.so, bir C ++ kitaplığı. İçinde kütüphane ve ana C programı arasında paylaşmak istediğim iki genel değişken var.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

İki senaryoyu test edin.

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

İçermek sharedata.h içinde gstdsexample.cpp ve main.c. Derleme Tamam ama ne zaman bir segmentasyon hatası alıyorum gstdsexample.cpp veri yazar *ptr.

Senaryo 2

İki değişken bildirme

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Sonra olarak ilan et extern içinde main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Şimdi derlerken iki değişkene tanımlanmamış referans hatalarım var main.c.

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

Ardından şunları ekleyin sharedata.h içinde gstdsexample.cpp ve main.c. Cpp lib için derleme iyi. Ama main için derleme.c'nin hataları var

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

Değişkenleri C ++ ve C kaynak dosyaları arasında nasıl paylaşabilirim?

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

En iyi cevabı

1

bir başlık dosyasında... 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'da.c

#include "gstdsexamle.h"

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

ana bölümde.c

#include "gstdsexamle.h"

Hepsi gerekir. mutex ve ptr artık main'de mevcut.cpp / ana.c

2021-11-24 04:47:45

gstdsexample lib gayet iyi. Ama ana.c, `mutex'e tanımlanmamış referans ve ptr'ye tanımlanmamış referans'olarak tanımlanmamış hatalara sahiptir.
batuman

Ben de bu beyan bu ana.c pthread_mutex_t mutex; int *ptr;
batuman
0

Senaryo 1 ve senaryo 2 geçersizdir çünkü C++, tanımlayıcının aşırı yüklenmesine izin vermek için C++ tanımlayıcılarının adlarını karıştırır.

Senaryo 3 başarısız çünkü extern "C" { } yapıcı, yalnızca C++ ' da geçerli sözdizimsel bir yapıdır ve C'de yasal değildir. Bunu yapabilmek için ayrıştırmanız gerekir

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

C++ derleyicisine, C çağıran şema ile uyumlu hale getirilecek değişkenler olduklarını belirtmek için.

Ancak C dili farklı bir dilden gelen bir şeyin farkında değildir, bu nedenle C'de bu bildirimler şu şekilde görünmelidir:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

üstbilgi dosyasında, ancak geçersiz sözdizimi olmadan.

Tek tanrılı bir cevapta bir yaklaşım ortaya konmuştur, bu yüzden orada söylenenleri açıklamayı uzatmayacağım, sadece şunu söylemek için __cplusplus__ makro, bir C++ derleyicisi gibi davrandığında derleyici tarafından otomatik olarak tanımlanır, böylece üstbilgi dosyasının C ve C++ bildirimlerini paylaşmasına izin vermek için diğer yanıtta olduğu gibi kullanılabilir.

2021-11-25 07:26:38

Diğer dillerde

Bu sayfa diğer dillerde

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