Совместное использование глобальной переменной из библиотеки C++ в основную программу на C

0

Вопрос

У меня есть gstdsexample.so, библиотека C++. Внутри у него есть две глобальные переменные, которыми я хотел бы поделиться между библиотекой и основной программой на языке Си.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Протестируйте два сценария.

Сценарий 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__ */

Включать sharedata.h в gstdsexample.cpp и main.c. Компиляция в порядке, но я получаю ошибку сегментации, когда gstdsexample.cpp записывает данные в *ptr.

Сценарий 2

Объявите две переменные в

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Затем объявите, как extern в main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Теперь у меня есть неопределенные ошибки ссылок на две переменные при компиляции main.c.

Сценарий 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__ */

Затем включите sharedata.h в gstdsexample.cpp и main.c. Компиляция для библиотеки cpp - это нормально. Но компиляция для main.c содержит ошибки, такие как

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

Как обмениваться переменными между исходными файлами C++ и C?

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

Лучший ответ

1

в заголовочном файле... 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.c

#include "gstdsexamle.h"

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

в основном.c

#include "gstdsexamle.h"

Это все, что тебе нужно. мьютекс и ptr теперь доступны в main.cpp/main.c

2021-11-24 04:47:45

библиотека gstdsexample в порядке. Но в main.c есть неопределенные ошибки, такие как "неопределенная ссылка на мьютекс и неопределенная ссылка на ptr".
batuman

Мне также нужно объявить об этом в main.c pthread_mutex_t mutex; int *ptr;
batuman
0

Сценарий 1 и сценарий 2 недопустимы, поскольку C++ искажает имена идентификаторов C++, чтобы обеспечить перегрузку идентификаторов.

Сценарий 3 завершается неудачей, поскольку extern "C" { } конструктор-это синтаксическая конструкция, допустимая только в C++, и она не является законной в C. Чтобы иметь возможность сделать это, вам нужно проанализировать

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

чтобы указать компилятору C++, что они являются переменными, которые должны быть совместимы со схемой вызова C.

Но язык C не знает о чем-то, исходящем из другого языка, поэтому в C эти объявления должны отображаться как:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

в заголовочном файле, но без недопустимого синтаксиса.

Подход был раскрыт в более раннем ответе, поэтому я не буду подробно объяснять, что там сказано, просто чтобы сказать, что __cplusplus__ макрос определяется компилятором автоматически, когда он действует как компилятор C++, поэтому его можно использовать, как и в другом ответе, чтобы разрешить файлу заголовка совместно использовать объявления C и C++.

2021-11-25 07:26:38

На других языках

Эта страница на других языках

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