Доступ к методу c++ объекта из c

Нужно из c файла вызвать метод c++ объекта, который уже объявлен и описан в c++ файле.
Проблема в том, что в интернете я нашёл только примеры с вызовами методов только вновь созданных объектов (то есть созданных в файле-обёртке).

Итак, имеется:
Собственно cpp файлы с нужным объектом:
blah.h:
class blah {
	public:
	int	method (void);
}
extern blah object;


blah.cpp:
#include "blah.h"

int	blah::method (void) {
	;
}
blah object;


Слой-обёртка для доступа к object.method () из c. Например вызвав функцию wrapper_method ():
wrapper.h:
extern "C" int wrapper_method ( void ) ;


wrapper.cpp:
#include "wrapper.h"
#include "blah.h"

int wrapper_method ( void ) {
	return object.method ();
}


При таком раскладе линковщик не может найти объект object в wrapper.o.
Собственно, как быть?
  • Вопрос задан
  • 4045 просмотров
Пригласить эксперта
Ответы на вопрос 4
evgeny_eJ
@evgeny_eJ
Рекомендую посмотреть на реализацию JNIEnv в jni.h.
Из Си его методы вызываются так: (*env)->callMethod(env, data)
Из C++ вот так: env->callMethod(data)
Ответ написан
Teivaz
@Teivaz
Попробуй в обёртке забиндить функуцию при помощи boost::bind или std::mem_fun

boost::bind<blah>(&blah::method, &obj);

std::mem_fun<void, blah>(&blah::method);
Ответ написан
Комментировать
@degs

Все прекрасно линкуется (gcc-4.6)

iBolit# make
g++    -c -o blah.o blah.cc
g++    -c -o wrap.o wrap.cc
cc    -c -o main.o main.c
cc   blah.o wrap.o main.o   -o blah
iBolit# ./blah
Blah!
iBolit# 
Я специально сделал main.c чтобы проверить линковку между C и C++ модулями, все работает. Скорее всего у вас что-то в процессе компиляции/линковки неправильно, например незаслуженно забыт файл blah.o при линковке.
На самом деле была ошибка в коде, пропущена ; после декларации класса blah в файле blah.h, но это дает ошибку при компиляции а не линковке.

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы