Как пользоваться библиотеками, скомпилированными с MingW в MSVC?

Я скомпилировал несколько библиотек с MingW/MSYS... сгенерированные статические библиотеки всегда являются.a файлами. Когда я пытаюсь связать библиотеку с проектом MSVC, Visual Studio бросает 'неразрешенные внешние ссылки'... Это означает, что.a статическая библиотека является несовместимой с MS Компоновщик C++. Я предполагаю, что это должно быть преобразовано в MSVC совместимый .lib файл.

Или.a и .lib являются просто архивами AR.o или .obj файлов, так есть ли какой-либо путь, как использовать скомпилированный MingW, освобождает в проекте MSVC? Или я должен компилировать/связывать все только в одном компиляторе/компоновщике - MSVC only/MingW только? Компилятор MingW, как говорят, совместим с MSVC.

Я считал несколько потоков об этой теме, но они главным образом говорят, что переименование файла к .lib должно сделать работу, но это, к сожалению, не работает на меня.

Библиотеки, которые я пытаюсь связать, записаны в 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 те же ошибки при обращении к другим функциям, вызванным из моего приложения.

Спасибо за любой совет.

14
задан NumberFour 27 March 2010 в 16:31
поделиться

3 ответа

На основании этой ошибки вы добавили комментарий:

ошибка LNK2019: неразрешенный внешний символ "int __cdecl openssl_call (struct 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 @.

12
ответ дан 1 December 2019 в 08:52
поделиться

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

10
ответ дан 1 December 2019 в 08:52
поделиться

Я привел те же ситуации, что и при использовании dll, скомпилированной с помощью mingw, в 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.exe. (Предположим, что you_dll.dll находится в том же каталоге, что и your_dll.def).

в настоящее время я могу использовать * .lib в моем проекте MSVC и правильно связать dll, но у меня возникла ошибка времени выполнения. В любом случае, такие работы сделают вашу привязку работоспособной.

9
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: