Как использовать библиотеки, скомпилированные с MingW в MSVC? - PullRequest
12 голосов
/ 27 марта 2010

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

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

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

Библиотеки, которые я пытаюсь связать, написаны на C.

MSVC Linker выдает такие ошибки, как:

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 ]

11 голосов
/ 27 марта 2010

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

ошибка 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 @.

10 голосов
/ 27 марта 2010

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

7 голосов
/ 13 июня 2010

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

...