Я скомпилировал несколько библиотек с 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 те же ошибки при обращении к другим функциям, вызванным из моего приложения.
Спасибо за любой совет.
На основании этой ошибки вы добавили комментарий:
ошибка 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 @.
Библиотеки совместимы, но только если вы предоставите интерфейс C. MSVC и g ++ используют разные схемы изменения имен, поэтому вы не можете легко связать код C ++, созданный одним, с кодом, созданным другим.
Я привел те же ситуации, что и при использовании 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, но у меня возникла ошибка времени выполнения. В любом случае, такие работы сделают вашу привязку работоспособной.