C ++ шаблон dll => неразрешенные внешние - PullRequest
2 голосов
/ 21 марта 2011

У меня есть функция шаблона в общей библиотеке. Я знаю, что функция будет вызываться с аргументами int или double. Поэтому я создаю экземпляр двух версий шаблона в исходном файле.

template void library::doSomething<int>(int const number);
template void library::doSomething<double>(double const number);

Это решение работает с g ++ в Linux (получая * .so), но когда я пытаюсь скомпилировать тот же код в * .dll в Windows, используя VS2010, я получаю ошибку, подобную этой:

ошибка LNK2001: неразрешенный внешний символ doSomething

Экспорт предоставляется в файле * .def, например:

ЭКСПОРТ

йоЗотеЬЫпд

Я что-то упустил или это решение "несовместимо" с Windows?

Спасибо.

Petr

1 Ответ

4 голосов
/ 21 марта 2011

Вам нужно поместить искаженные имена созданных функций в файл DEF, а не имена C ++.

Подробнее об этом можно прочитать в статье MSDN Экспорт из DLL с использованием файлов DEF :

Если вы экспортируете функции в файл C ++, вы должны либо поместить оформленные имена в файл .def, либо определить свои экспортируемые функции со стандартной связью C, используя extern "C".

Если вам нужно поместить оформленные имена в файл .def, вы можете получить их с помощью инструмента DUMPBIN или с помощью опции компоновщика / MAP. Обратите внимание, что оформленные имена, созданные компилятором, зависят от компилятора.

Если вы помещаете оформленные имена, созданные компилятором Visual C ++, в файл .def, приложения, которые ссылаются на вашу DLL, также должны создаваться с использованием той же версии Visual C ++, чтобы оформленные имена в вызывающем приложении соответствовали экспортируемому имена в DLL-файле .def.

Обычно, использование __declspec(dllexport) гораздо проще, и если вы можете использовать его, вам следует подумать об этом.

...