Совместимость *.dll *.a *.lib *.def между VisualStudio и gcc - программирование
Подтвердить что ты не робот

Совместимость *.dll *.a *.lib *.def между VisualStudio и gcc

Это очень запутанно. Я потратил много времени на чтение сообщений об этом на стеке и т.д. Все еще запутался.

Я использую Qt и С++ для кодирования. В Qt я использую параметр gcc для компилятора.
Проблема в том, что многие сторонние библиотеки, которые я пробовал, похоже, не работают.

Я новичок в .dll,.a,.lib,.def файлах и библиотечных схемах.

Вопрос 1:

В моем ограниченном опыте (до сих пор я пробовал 7 или 9 библиотек), поставщики библиотек редко говорят вам, была ли сделана DLL с VisualStudio или gcc. Это добавляет много путаницы. Они почти никогда не дают понять, с каким компилятором совместима библиотека. Поэтому я был бы признателен за некоторые реальные советы о том, как бороться с этим кошмаром. Почти все библиотеки, которые я пробовал, - это проекты OpenSource. Я не буду называть имена здесь, но это хорошо известные проекты. Я уверен, что проблема в том, что я не знаю...

MinGW и gcc World

Вопрос2:
Насколько я могу судить, динамические библиотеки С++ для MinGW gcc universe требуют их, верно?
*.h
*.dll
*.a

Вопрос 3:
К сожалению, файл .a часто отсутствует, и библиотека не работает. Это очень запутанно. Если файл .a отсутствует, мне не повезло?

Вопрос 4:
Могу ли я сгенерировать файл .a для MinGW/gcc, если *.dll был создан с помощью gcc?

Вопрос 5: Могу ли я сгенерировать файл .a для MinGW/gcc, если *.dll был создан с помощью VisualStudio?

Вопрос 6:
Возможно ли, что *.dll(сделанный с MinGW/gcc) слишком стар и больше не совместим с более новым MinGW/gcc?

Вопрос 7:
Проекты Qt с использованием MinGW/gcc никогда не нуждаются в *.lib файлах, правильно? Это только VisualStudio, верно?

Вопрос 8:
Мне не нужен файл *.def для использования *.dll в проектах Qt с использованием MinGW/gcc, правильно?

Мир VisualStudio

Вопрос 9:
Насколько я могу судить, для динамических библиотек С++ для VisualStudio требуется следующее:
*.h
*.dll
*.lib

Правильно? Опять же, проблема в том, что файл *.lib почти всегда отсутствует. Кроме того, нет четких инструкций о том, с каким компилятором совместима библиотека. Итак, как я могу узнать, что это только для VisualStudio или нет?

Вопрос 10:
Если файл .lib отсутствует, мне не повезло?

Вопрос 11:
Могу ли я сгенерировать файл .lib для VisualStudio, если *.dll был создан с помощью VisualStudio? Как?

Вопрос 12:
Могу ли я генерировать .lib файл для VisualStudio, если *.dll был создан с помощью MinGW/gcc? Как?

Вопрос 13:
Возможно ли, что *.dll(сделанный с VisualStudio) слишком стар и больше не совместим с более новым VisualStudio?

Вопрос 14:
Если в QtCreator я выбираю компилятор VisualStudio, то он на 100% совместим с динамическими библиотеками, скомпилированными с REAL VisualStudio кем-то другим? Я считаю, что параметр компилятора VisualStudio в Qt Creator является поддельным компилятором VisualStudio.

Вопрос 15:
Если в QtCreator я выбираю компилятор MinGW/gcc, могу ли я использовать с динамическими библиотеками Qt, скомпилированными с REAL VisualStudio кем-то другим?

Вопрос 16:
Мне не нужен файл *.def для использования *.dll в проектах Qt с использованием MinGW/gcc, правильно?

Вопрос 17: Могу ли я преобразовать * lib (который работает с файлом *.dll и *.h), созданный с REAL VisualStudio, в файл *.a, чтобы я мог использовать файл *.a с неизмененными *.dll и *.h файлы в проекте Qt gcc?

4b9b3361

Ответ 1

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

Запуск - это ABI (двоичный интерфейс приложения). Это определяет такие вещи, как

  • как вызывается функция, например. какие параметры входят в какие регистры или какое место в стеке они помещают
  • как выбрасываются исключения
  • как выкладываются объекты, например. где идет "указатель vtable", какое дополнение используется
  • насколько велики встроенные типы данных
  • как имена функций "искажены" в символы
  • информация о типе информации
  • расположение стандартных классов библиотеки
  • и др.

Большинство платформ определяют C ABI, но не определяют С++ ABI. В результате компилятор определяет свой собственный ABI (для всего, кроме материала C, который обычно существует). Это дает объектные файлы, которые несовместимы между разными компиляторами (иногда даже между версиями одного и того же компилятора).

Как правило, это проявляется в странно выглядящих именах как бы undefined: разные ABI преднамеренно используют различное имя для предотвращения случайного связывания исполняемого файла, который не будет работать в любом случае. Чтобы обойти их, лучше всего собрать все компоненты с использованием одного и того же компилятора.

Если вы хотите определить, с каким компилятором создается библиотека, вы можете просмотреть его содержимое с помощью соответствующих инструментов. Я понимаю, что вы попросили Windows, но я знаю только инструменты UNIX (они могут быть доступны с MingW):

  • nm для просмотра имен символов (обычно вместе с меньшим или grep)
  • ar для создания или проверки библиотек
  • ident найти специальные строки, встроенные в объект
  • строки для всех строк
  • С++ filter для демонстрации символов в их декларации С++

Глядя на символы, обычно дает идентификаторы того, что их создал компилятор. Если вы видели их довольно часто, вы даже можете указать ABI из самих символов.

В этой области есть еще много, но у меня закончилась выносливость...:-) В любом случае, я думаю, что это отвечает на несколько из вышеперечисленных вопросов.

Ответ 2

Я наткнулся на этот вопрос при поиске инструмента для создания файла .a с помощью компилятора Code:: Blocks С++ для Windows. Код: Blocks использует компилятор MinGW gcc. Думаю, это было достаточно высоко, чтобы проверить мою некромантию.

Библиотеки динамических ссылок (dll) - это смешанная группа. Некоторые могут быть скомпилированы таким образом, что их очень сложно использовать вне языка программирования и компилятора, с которым они были созданы.

Часто, однако, dll создается с помощью чистого C-интерфейса. Когда это так, ответы на ваши вопросы, на которые я могу ответить, это:

1: это не вопрос.

2, 9: yes

3, 10: no

4, 11: да. MinGW включает инструмент (dlltool.exe), который принимает .dll и .def файл и создает файл .a MS VisualStudio также включает инструмент (который, я думаю, называется lib.exe), чтобы сделать то же самое. И если вы начнете использовать другой компилятор, вы, вероятно, обнаружите, что у них тоже есть инструмент. У компиляторов Borlands был инструмент implib.exe.

5, 12: да (то же, что и 4)

6, 13: pew... Я не думаю, что есть дата истечения срока действия в dll, но они должны быть скомпилированы для правильной операционной системы.

8, 16: вам понадобится .def, чтобы сделать .a или .lib, если у вас его нет, на самом деле возможно создать это из .dll

Ответ 3

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

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

Создание DLL файлов подобно созданию любого другого приложения - вы просто нацеливаете свою сборку как на DLL, а не на EXE или что-то еще.

Чтобы создать любое приложение - DLL, EXE или иначе - вам нужен необходимый исходный код и заголовки..h файлы содержат декларации для функций и типов данных и классов, а еще ничего - они редко содержат код. Файл .def очень похож на .h, но обычно представляет собой набор инструкций для компоновщика.

Когда вы компилируете,.h или .c или все, что угодно, превращается в .obj - объектный файл. Несколько объектных файлов связаны между собой для создания вашей DLL или EXE.

Файл .lib представляет собой статическую библиотеку - по существу, группу файлов .obj(или одного .obj), которые были объединены для этапа компоновки.

Формат файлов .obj и .lib может быть специфичным для компилятора, и они редко совместимы между компиляторами. У вас должен быть исходный исходный код или .obj или .lib, созданный специально для вашего компилятора.

Когда вы решите сделать EXE с "динамически связанными библиотеками", ожидается, что DLL файлы будут использоваться. Когда вы выберете "статически связанные библиотеки", компоновщик найдет файлы .lib, необходимые для создания EXE, и вам не нужны эти DLL.

Ответ 4

вопрос 1: вы должны импортировать файл .h и ссылку .a по команде компоновщика и скопировать .dll рядом с вашим выходом .exe.

вопрос 2: вы можете сделать файл .a файлом .def

set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%PATH%

dlltool.exe -d libfftw3-3.def -l libfftw3-3.a

вопрос 3: нет. вы можете сделать файл .def вручную и после make .a.

вопрос 4,5: да

Вопрос 6: Я думаю, что это зависит от вашего оборудования и операционной системы не от вашего компилятора.

Вопрос 7: Я не знаю.

вопрос 8: вам нужно только .h .a .dll не .def

вопрос 9: .lib файлы для визуальной студии.

вопрос 10: вам не нужны .def и .dll, чтобы сделать .lib, и вы можете сделать . def самостоятельно, если у вас его нет.

set PATH=C:\Program Files\Microsoft Visual Studio 12.0\VC\bin;%PATH%

lib /machine:x86 /def:libfftw3-3.def

или

lib /machine:x64 /def:libfftw3-3.def

Вопрос 11: да, я сказал вам выше.

вопрос 12: да

вопрос 13: нет.