У меня есть старая библиотека (на С++), которую я могу собрать только на MinGW+MSYS32 в Windows. Из этого я могу создать файл статической библиотеки .a, сгенерированный из GNU libtool. Моя основная разработка выполняется в Visual Studio 2008. Если я попытаюсь взять созданную MinGW библиотеку и связать ее в Visual Studio, она жалуется на отсутствие внешних компонентов. Скорее всего, это связано с изменением символов C++, которое не соответствует тому, что находится в файле .a. Есть ли способ преобразовать статический файл .a в формат библиотеки VC++?
Преобразование из MinGW .a в VC++ .lib
Ответы (2)
Если символы искажаются по-разному, компиляторы используют другой ABI, и вы не сможете «преобразовать» или что-то еще в скомпилированных библиотеках: причины, по которым имена искажаются по-разному, преднамеренны, чтобы пользователи никогда не преуспели в создании исполняемого файла. из объектных файлов с использованием разных ABI. ABI определяет, как передаются аргументы, как представляются таблицы виртуальных функций, как генерируются исключения, размер базовых типов данных и целый ряд других вещей. Изменение имени также является частью этого и тщательно выбрано, чтобы быть эффективным и отличаться от других ABI на той же платформе. Самый простой способ увидеть, действительно ли искажение имени отличается, — скомпилировать файл с парой функций, используя только базовые типы с обоими компиляторами, и посмотреть на символы (в UNIX я бы использовал для этого nm
; я не программист Windows, и поэтому я не знаю, какой инструмент там использовать).
На основе Википедии кажется, что MinGW также использует другую библиотеку времени выполнения: макет и реализацию стандартной библиотеки C++, используемой MinGW (libstdc++) и Visual Studio (Dinkumware) несовместим. Даже если ABI между двумя компиляторами одинаков, используемая стандартная библиотека C++ отличается. Если ABI такой же, вам нужно будет заменить настройки, чтобы один компилятор использовал стандартную библиотеку соответствующего другого компилятора. Это невозможно сделать с уже скомпилированной библиотекой. Я не знаю, выполнимо ли это.
Лично я бы не стал пытаться связать вещи между этими двумя разными компиляторами, потому что он вообще не будет работать. Вместо этого вам нужно будет перенести реализацию на общий компилятор и перейти оттуда.
Найдите файл def и запустите команду, например. lib /machine:i386 /def:test.def создаст файл импорта lib.