Совместимость *.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?
Ответы
Ответ 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: нет.