Это не так сложно сделать вручную, но будет зависеть от размера вашего интерфейса.
В тех случаях, когда я делал это, разрешалось использовать нашу библиотеку C ++ из чистого кода C, и, таким образом, SWIG не сильно помог. (Ну, может быть, SWIG можно использовать для этого, но я не гуру SWIG, и это казалось нетривиальным)
Все, что мы в итоге сделали, было:
- Каждый объект передается в C непрозрачной ручкой.
- Конструкторы и деструкторы заключены в чистые функции
- Функции-члены являются чистыми функциями.
- Другие встроенные функции отображаются в эквиваленты C, где это возможно.
Итак, такой класс (заголовок C ++)
class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}
Будет сопоставляться с интерфейсом C следующим образом (заголовок C):
struct HMyClass; // An opaque type that we'll use as a handle
typedef struct HMyClass HMyClass;
HMyClass * myStruct_create( const char * s );
void myStruct_destroy( HMyClass * v );
int myStruct_doSomething( HMyClass * v, int i );
Реализация интерфейса будет выглядеть так (источник C ++)
#include "MyClass.h"
extern "C"
{
HMyClass * myStruct_create( const char * s )
{
return reinterpret_cast<HMyClass*>( new MyClass( s ) );
}
void myStruct_destroy( HMyClass * v )
{
delete reinterpret_cast<MyClass*>(v);
}
int myStruct_doSomething( HMyClass * v, int i )
{
return reinterpret_cast<MyClass*>(v)->doSomething(i);
}
}
Мы извлекаем наш непрозрачный дескриптор из исходного класса, чтобы избежать необходимости в приведении, и (это не работает с моим текущим компилятором) Мы должны сделать дескриптор структурой, поскольку C не поддерживает классы.
Так что это дает нам базовый интерфейс C. Если вам нужен более полный пример, показывающий, как можно интегрировать обработку исключений, попробуйте мой код на github: https://gist.github.com/mikeando/5394166
Самое интересное - теперь вы гарантированно получаете все необходимые библиотеки C ++, связанные с вашей большой библиотекой. Для gcc (или clang) это означает, что нужно просто выполнить финальную стадию соединения, используя g ++.