Как использовать библиотеки, скомпилированные с MingW в MSVC?
я скомпилировал несколько библиотек с MingW / MSYS... сгенерированные статические библиотеки всегда .папка. Когда я пытаюсь связать библиотеку с проектом MSVC, Visual Studio выдает "неразрешенные внешние символы"... Это значит, что ... статическая библиотека несовместима с компоновщиком MS C++. Я предполагаю, что он должен быть преобразован в MSVC-совместимый .файла lib.
либо .а .lib-это просто архивы AR .О или .obj-файлы, так что есть ли способ использовать скомпилированные библиотеки MingW в Проект MSVC? Или мне нужно скомпилировать / связать все только в одном компиляторе / компоновщике-только MSVC/MingW? Компилятор MingW считается совместимым с MSVC.
Я прочитал несколько тем по этой теме ,но они в основном говорят, что переименование файла.Либ должна работать, но, к сожалению, это не работает для меня.
библиотеки, которые я пытаюсь связать, написаны на C.
MSVC Компоновщик выдает ошибки, такие как:
error LNK2019: unresolved external symbol "int __cdecl openssl_call(struct ssl_State *,int,int,int)" (?openssl_call@@YAHPAUssl_State@@HHH@Z) referenced in function _main MyAPP.obj
... и еще 4 таких же ошибки, относящиеся к другим функциям, вызываемым из моего приложения.
Спасибо за любой совет.
3 ответов
на основе этой ошибки вы помещаете комментарий:
ошибка LNK2019: неразрешенный внешний символ " int _ _ cdecl openssl_call (структура ssl_State *, int, int, int)" (?openssl_call@@YAHPAUssl_State@ @ HHH@Z) ссылка в функции _main MyAPP.параметр obj все остальные 4 ошибки одинаковы только с другие имена функций
положить extern "C"
вокруг ваших файлов включения для openssl. Например:
extern "C" {
include "openssl.h"
}
используя extern "C" будет проинструктируйте компилятор, что функции используют связь C, а не C++, что остановит его выполнение имя коверкая на функции. Таким образом, он будет искать функцию openssl_call в библиотеке, а не ?openssl_call@@YAHPAUssl_State@@HHH@.
библиотеки совместимы, но только если вы предоставите интерфейс c. MSVC и g++ используют разные схемы искажения имен, поэтому вы не можете легко связать код c++, созданный с одним, с кодом, созданным другим.
Я столкнулся с теми же ситуациями, которые используют MinGW-скомпилированную dll в MSVC. Я использую следующие инструменты, чтобы заставить его работать:
1) Используйте gcc так:
gcc-shared-o your_dll.dll файлы your_dll_src.c - Wl,--output-def, your_dll.def
жирным шрифтом указывается, что gcc будет генерировать файл * def, который создает сценарии экспортируемых элементов.Тогда вам нужно использовать lib.exe, который распространяется с MSVC, пример такой:
lib / def: your_dll.def
тогда, будет your_dll.lib файл, происходит от lib.исполняемый.(Предположим, что you_dll.dll находится в том же каталоге, что и your_dll.DEF.)
в настоящее время, я могу использовать *.lib в моем проекте MSVC и правильно связать dll, но я получил ошибку времени выполнения. Во всяком случае, такие работы делают вашу связь работоспособной.