Использование MSVC ++ .lib файлов с mingw.Имя искажения - PullRequest
4 голосов
/ 24 января 2012

У меня есть статическая библиотека C ++, скомпилированная с MSVC и файлом dll (библиотека называется opennurbs).Мне нужно использовать эту библиотеку в проекте, скомпилированном mingw (я использую Qt creator, но проект не использует библиотеки qt).Итак, у меня есть неразрешенные внешние проблемы.Я думаю, что проблема с искажением имени.Как я могу преобразовать файл .lib в библиотеку .a?Я пытаюсь использовать команду nm, но она не работает: «В foo.dll нет символов».Extern "C" не работает, потому что это библиотека C ++.

Ответы [ 2 ]

4 голосов
/ 24 января 2012

Вообще говоря, вы не сможете использовать C ++ DLL, собранную с одним компилятором, из программы, созданной с другой.Перенос имен - это только одна из проблем - не существует гарантии совместимости для обработки исключений, RTTI, управления памятью или даже самой структуры классов (особенно для множественного и виртуального наследования), чтобы назвать лишь несколько потенциальных проблем.

Некоторые предложения (ни один из них не идеален):

  • Лучшее решение - если вы можете полностью обойти исходную проблему и либо получить двоичные файлы для вашего компилятора, либо собрать из исходного кода (то есть собрать как DLL, так и ееклиент от MinGW в вашем случае).
  • Если вы можете представить интерфейс DLL как чистый C API, сделайте это.Например, Win32 - это «C API», и он довольно хорошо работает со всеми видами компиляторов, а не только с C / C ++.
  • Если вы хотите «объектно-ориентированный» API для вашей DLL, вам не нужна переносимость и вы готовычтобы потратить необходимые усилия на разработку, предоставление COM API может стоить посмотреть.
2 голосов
/ 24 января 2012

Довольно сложно понять, в чем именно заключается ваша проблема, но одно решение очевидно.Код openNURBS находится в свободном доступе с полностью разрешительной лицензией.Вам нужно просто скачать его и скомпилировать прямо в mingw.

В любом случае это будет единственный жизнеспособный маршрут.C ++ не имеет стандартного двоичного интерфейса, и каждый инструмент имеет свой двоичный интерфейс.Это может даже отличаться между различными версиями одного и того же инструмента.Более того, скомпилированная библиотека MSVC будет зависеть от другой библиотеки времени выполнения C ++ от вашего скомпилированного кода mingw.

Итак, суть в том, что вам нужен openNURBS, скомпилированный вашим компилятором mingw.Но, к счастью, это возможно, потому что библиотека распространяется как источник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...