Как использовать библиотеки, скомпилированные с 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, но я получил ошибку времени выполнения. Во всяком случае, такие работы делают вашу связь работоспособной.