Совместимость * .dll * .a * .lib * .def между VisualStudio и gcc - PullRequest
20 голосов
/ 30 декабря 2011

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

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

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

Вопрос 1:

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

MinGW и gcc World

Вопрос2:
Насколько я могу судить, динамический C ++библиотеки для 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 World

Вопрос 9:
Насколько я могу судить, для динамических библиотек C ++ для 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?

Ответы [ 4 ]

15 голосов
/ 30 декабря 2011

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

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

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

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

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

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

  • нм, чтобы посмотреть на имена символов (обычно вместе с less или grep)
  • ar для создания или проверки библиотек
  • id для поиска специальных строк, встроенных в объект
  • строк для поиска всех строк
  • c ++ Filt для разделения символов на ихОбъявление C ++

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

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

7 голосов
/ 05 января 2013

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

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

Часто, однако, DLL создается с чистым интерфейсом C.В таком случае ответы на ваши вопросы, на которые, я думаю, я смогу ответить:

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

2, 9: да

3,10: нет

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 голосов
/ 30 декабря 2011

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.

0 голосов
/ 12 декабря 2015

вопрос 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 вручную и после создания файла .a.

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

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

вопрос 7: я не знаю.

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

вопрос 9: .lib files для visual studio.

вопрос 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: нет.

...