Конвертировать из MinGW .a в VC ++ .lib - PullRequest
4 голосов
/ 19 февраля 2012

У меня есть старая библиотека (на C ++), которую я могу собрать только на MinGW + MSYS32 на Windows. Исходя из этого, я могу создать файл статической библиотеки .a, сгенерированный из GNU libtool. Моя основная разработка выполняется в Visual Studio 2008. Если я пытаюсь взять библиотеку, созданную MinGW, и связать ее в Visual Studio, она жалуется на отсутствие внешних элементов. Скорее всего, это связано с тем, что выполнено искажение символов C ++ и что оно не совпадает с тем, что содержится в файле .a. Есть ли какой-нибудь известный способ конвертировать статический файл .a в формат библиотеки VC ++?

Ответы [ 2 ]

6 голосов
/ 19 февраля 2012

Если символы искажены по-разному, компиляторы используют другой ABI, и вы не сможете «конвертировать» или что-либо подобное скомпилированным библиотекам: имена причин искажаются по-разному, это намеренно, чтобы пользователи никогда не преуспели с построение исполняемого файла из объектных файлов с использованием различных ABI. ABI определяет, как передаются аргументы, как представляются таблицы виртуальных функций, как генерируются исключения, размер базовых типов данных и ряд других вещей. Название искажения также является частью этого и тщательно выбрано, чтобы быть эффективным и отличным от других ABI на той же платформе. Самый простой способ узнать, действительно ли имя искажения действительно отличается, - это скомпилировать файл с парой функций, используя только базовые типы с обоими компиляторами, и взглянуть на символы (в UNIX я бы использовал nm для этого; I ' я не программист Windows, и поэтому я не знаю, какой инструмент использовать там).

Основываясь на Википедии , кажется, что MinGW также использует другую библиотеку времени выполнения: макет и реализацию стандартной библиотеки C ++, используемой MinGW ( libstdc ++ ) и Visual Studio ( Dinkumware ) не совместим. Даже если ABI между двумя компиляторами одинаков, стандартная библиотека C ++ не такова. Если ABI такой же, вам нужно заменить настройки так, чтобы один компилятор использовал стандартную библиотеку соответствующего другого компилятора. Нет никакого способа сделать это с уже скомпилированной библиотекой. Я не знаю, выполнимо ли это.

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

2 голосов
/ 25 мая 2012

Найдите файл def и выполните команду, например, lib / machine: i386 /def:test.def это сгенерирует импортировать файл lib.

...