2016-05-07 5 views
0

Я использую MinGW (i686-4.9.2-win32) и пытается экспортировать класс из DLL (который сделан в Visual Studio), Но я получаю сообщение об ошибке undefined reference to _imp___ZN11ConsoleTestC1E'Ошибка компоновщика. MinGW не может экспортировать класс из МСВС DLL

НО функция foo() из той же библиотеки, экспортируемой без ошибок ..

Вот мой код

testdll.h

#ifdef CONSOLETEST_EXPORT 
#define CONSOLETEST_API __declspec(dllexport) 
#else 
#define CONSOLETEST_API __declspec(dllimport) 
#endif 

extern "C" class CONSOLETEST_API ConsoleTest{ 
public: 
    ConsoleTest(); 
}; 
extern "C" void CONSOLETEST_API foo(); 

testdll.cpp

#include "testdll.h" 
ConsoleTest::ConsoleTest(){} 
void foo(){} 

И в main.cpp:

#include "testdll.h" 
int main() 
{ 
    foo(); 
    ConsoleTest* cc = new ConsoleTest(); 
} 

PS: Я пытался создать .a библиотеки из .dll:

pexports testdll.dll | sed "s/^_//" > testdll.def 
dlltool -U -d testdll.def -l testdll.a 

... но это не помогло.

Заранее благодарим за любой совет!

+0

Просто примечание: поскольку вы используете mingw, вам не нужно связываться с dllimport/dllexport. Mingw обрабатывает это автоматически, как на хороших ELF-системах (если вы получаете предупреждение компоновщика, вы можете его подавить с помощью опции '-Wl,-enable-auto-import'). –

+0

Спасибо, я этого не знал! –

ответ

1

extern "C" class не будет работать. Вы можете dll-экспортировать класс, но не с C именованием.

ISO C++ 03 7.5 [dcl.link]/4: тяги языка

A C игнорируются для имен членов класса и функции членов типа функций-членов класса.

Если вы удалите extern "C", я не вижу причин, чтобы это не сработало.

+0

Спасибо! О, да, вы правы, «c» и классы - я должен был знать. Нет, без экстерна «C» даже функция «foo» не работает. В любом случае, я не нашел решение и пошел другим путем. –

Смежные вопросы