Преобразование из MinGW .a в VC++ .lib

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


person John R    schedule 19.02.2012    source источник
comment
Нет, вы не можете этого сделать. Вам нужно перекомпилировать двоичный файл в компиляторе, который вы хотите использовать для его компоновки.   -  person Cody Gray    schedule 19.02.2012


Ответы (2)


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

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

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

person Dietmar Kühl    schedule 19.02.2012
comment
Обратите внимание, что в целом код C можно использовать из разных компиляторов. MinGW GCC может ссылаться на файлы VC .lib, но обратное невозможно. - person rubenvb; 19.02.2012

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

person Gabor Forgacs    schedule 25.05.2012