Как сделать библиотеку из dll
Обновлено: 21.11.2024
DLL — это библиотеки с динамическим подключением, что означает, что они связаны с вашей программой во время выполнения, а не во время сборки. DLL состоит из трех частей:
код и данные
библиотека импорта
Код и данные — это те части, которые вы пишете: функции, переменные и т. д. Все они объединяются вместе, как если бы вы создавали один большой объектный файл, и помещаются в dll. Они вообще не помещаются в ваш .exe.
Экспорт содержит список функций и переменных, которые dll делает доступными для других программ. Думайте об этом как о списке «глобальных» символов, остальные скрыты. Обычно вы создаете этот список вручную с помощью текстового редактора, но это можно сделать автоматически из списка функций в вашем коде. Программа dlltool создает раздел экспорта dll из вашего текстового файла экспортированных символов.
Библиотека импорта представляет собой обычную UNIX-подобную библиотеку .a, но она содержит только крошечную часть информации, необходимой для того, чтобы сообщить ОС, как ваша программа взаимодействует с dll ("импортирует"). Эта информация связана с вашим .exe . Это также генерируется dlltool .
Создание библиотек DLL
Давайте рассмотрим простой пример создания dll. В этом примере мы будем использовать один файл myprog.c для программы ( myprog.exe ) и один файл mydll.c для содержимого dll ( mydll.dll ).
К счастью, с последними версиями gcc и binutils процесс сборки dll теперь довольно прост. Допустим, вы хотите создать эту минимальную функцию в mydll.c:
Сначала скомпилируйте mydll.c в объектный код:
Затем сообщите gcc, что он создает общую библиотеку:
Вот оно! Чтобы закончить пример, теперь вы можете связать dll с помощью простой программы:
Затем свяжите свою dll с помощью команды, например:
Однако, если вы создаете dll в качестве библиотеки экспорта, вам, вероятно, потребуется использовать полный синтаксис:
Имя вашей библиотеки — $ с префиксом cyg для DLL и lib для библиотеки импорта. Библиотеки Cygwin используют префикс cyg, чтобы отличить их от собственных библиотек DLL MinGW для Windows. Дополнительные сведения см. на веб-сайте MinGW. $ — это все ваши объектные файлы, объединенные в статические библиотеки или отдельные объектные файлы, а $ — это импортные библиотеки, с которыми вам нужно связать, например, '-lpng -lz -L/usr/local/special -lmyspeciallib' .
Связывание с DLL
Если у вас уже есть DLL, вам нужно создать библиотеку импорта, совместимую с Cygwin. Если у вас есть исходный код для компиляции DLL, обратитесь к разделу «Создание DLL» для получения подробной информации о сборке gcc для вас. Если у вас нет исходного кода или поставляемой рабочей библиотеки импорта, вы можете получить большую часть пути, создав файл .def с помощью этих команд (вам может потребоваться сделать это в bash, чтобы цитирование работало правильно):
Обратите внимание, что это будет работать, только если DLL не удалена. В противном случае вы получите сообщение об ошибке: «Нет символов в foo.dll».
Получив файл .def, вы можете создать из него библиотеку импорта следующим образом:
Я пытаюсь создать приложение в Visual Studio, которое сможет получить доступ к уже существующему файлу .dll. Мне нужно приложение для вызова подпрограмм. У меня также есть файл заголовка, который уже существует.
Информация в ссылке говорит о создании файла DEF (я где-то читал, что его нужно скомпилировать как DLL с тем же именем, но не уверен, что это за имя, то же имя, что и у файла .dll?) . Но я не понимаю первое направление, «Использовать DUMPBIN/EXPORTS». Затем мне нужно «заглушить» функции, а затем что-то сделать с файлами .OBJ (я не знаю, что это за файлы).
Есть ли какие-либо пошаговые инструкции, похожие на приведенную выше ссылку, которым легко следовать?
Я собираюсь использовать Microsoft Visual Studio 2010 в качестве приложения для использования между DLL и Matlab. DLL называется Wintab32, она обнаруживается при использовании графического планшета.
5 ответов 5
Вам понадобится Microsoft Visual C++ 2010 Express (или любой другой источник инструментов командной строки MSVC) и ваша библиотека DLL.
- dumpbin /EXPORTS yourfile.dll > yourfile.exports
- Вставьте имена необходимых функций из файла yourfile.exports в новый файл yourfile.def. Добавьте строку со словом EXPORTS вверху этого файла.
- Выполните следующие команды из каталога VC\bin (где находится lib.exe и другие инструменты компиляции).
или для сборок x64
Вы должны получить два сгенерированных файла: yourfile.lib и yourfile.exp
Использование dumpbin.exe /EXPORTS yourfile.dll для шагов 1 и 2 вместо Dependency Walker также подходит для получения экспортированных имен функций.
Дампбин не удался ("ССЫЛКА: фатальная ошибка LNK1328: table de chaînes manquante"), поэтому я использовал зависимости и создал файл def вручную.
Вы можете использовать инструмент Digital Mars IMPLIB. Он может создать файл lib, используя только dll, без необходимости в файле .def.
Командная строка:
Спасибо, я смотрю на этот IMPLIB, который вы предложили. По ссылке предлагается следующая строка кода: implib /s kernel32.lib kernel32.dll . Я новичок в C++, как мне приступить к реализации кода?
Это не код C++ :) Просто откройте консоль (cmd) и выполните implib, используя вашу dll (как показано в примере с kernel32). Затем поместите полученный файл .lib в папку lib вашей IDE (или в папку проектов и добавьте путь к библиотеке в проект). После этого вы сможете свободно использовать эту библиотеку (только не забудьте сохранить DLL в той же папке, что и исполняемый файл).
Здравствуйте, я использовал этот метод и получил повреждение из-за ошибки файла в VS 2015. Мне пришлось использовать решение Sany Liew, чтобы файлы lib работали правильно.
Я сомневаюсь, что решение Digital Mars будет работать. В то время как VS использует формат PE-COFF, DM использует формат OEM, который требует дополнительного шага для преобразования в форму, пригодную для использования в VS.
Существует гораздо более простой способ создания файла .def. Поищите в Интернете утилиту gendef (возможно, она у вас уже есть, если у вас есть Mingw-64). Получив его, просто перейдите в командную строку и введите
И это создаст myfile.def . После этого просто используйте lib.exe для создания файла myfile.lib, как объяснил Джон.
затем включите их
linker->input->def файл, затем наследуется от родительского или проектного значения по умолчанию
Теперь, когда вы определили API экспорта, вам нужно применить его ко всем функциям в файле заголовка в проекте .dll. Например:
Объявляйте свои функции экспорта как обычно, но добавляйте API между типом объявления и именем функции.
Для определения функции в файле .cpp в проекте .dll API в объявлении не требуется.
Вот пример имя файла.h и имя файла.cpp со всем кодом.
Теперь, когда вы компилируете проект, вы должны увидеть файлы .dll, .lib и .exp в папке, в которой сохранены скомпилированные файлы. Теперь вы можете связать файл .exe с файлом .lib. Добро пожаловать!
Интернет – это обширная сеть. Поскольку технология совершенствуется год за годом, это также делает важным процесс создания программ и программного обеспечения, и важно знать, какой тип файла человек хочет использовать для своей работы, и анализировать преимущества и недостатки каждого из них. компонент, который используется при создании программного обеспечения.
Читатели, которые читают это, также читают:
LIB и DLL — это библиотеки, которые используются для создания кода для различных программ/приложений. Они используются дизайнерами и кодерами, а не обычными пользователями компьютеров. Для открытия этих типов файлов требуется код или какая-либо конкретная программа или программное обеспечение.
LIB и DLL
Основное различие между LIB и DLL заключается в том, что файлы DLL можно использовать повторно, так как их нужно только связать с предыдущей DLL, в то время как LIB не обладает этим качеством, и код должен быть скопирован из предыдущей программы в более новую. Еще одно отличие состоит в том, что LIB выглядит как большой файл, а DLL состоит из нескольких файлов.
LIB — это статическая библиотека ссылок, которая работает в соответствии с временем операционной системы. На электронном устройстве она размещается в виде единого файла, который сравнительно больше, чем другие библиотеки, но благодаря этому аспекту избавляет пользователя от проблем с версиями.
DLL — это динамически подключаемая библиотека, которая компилируется загрузчиком во время выполнения. Это экономит память и место на компьютере или диске, что является преимуществом по сравнению с любой библиотекой статических ссылок, такой как LIB. Библиотеки DLL считаются лучше, чем LIB, из-за возможности повторного использования, производительности и занимаемого места.
Таблица сравнения LIB и DLL
Что такое LIB?
LIB – это тип файла, который содержит библиотеку информации. Он также может содержать изображения, вырезки текста и функции, на которые ссылается программа. Файлы LBB могут быть как статическими библиотеками, содержащими объектные файлы, так и импортированными библиотеками, иногда также называемыми архивами.
Библиотеки LIB не открываются вручную. Для их взлома требуется определенное программное обеспечение, которое зависит от программы и версии. Поскольку все компоненты в этой библиотеке скомпилированы в один большой файл, она не решает проблему управления различными переменными, функциями и подмаршрутами, которые в ней находятся.
Они немного больше, чем другие библиотеки, и код копируется из основного приложения, в отличие от динамически подключаемых библиотек, где код может быть связан. Если есть какие-либо изменения в выполнении программы, необходимо внести изменения или редактирование, чтобы она работала. Потребуется повторное связывание и перекомпиляция.
Что такое DLL?
DLL — это динамически подключаемая библиотека, которая подключается загрузчиком во время выполнения. Это дает ей преимущество перед LIB, которая является статической библиотекой.Они компилируются во время выполнения, не только экономя память, но и повышая производительность.
Основная цель DLL — открывать и выполнять функции других различных программ. Они не могут запускаться напрямую, и для их открытия требуется дополнительный код. Конечно, они полезны, но эти типы файлов обычно не открываются, кроме кодеров или других технических специалистов, поскольку в них нет ничего особенного для пользователя, и любая ошибка при их просмотре приведет к проблеме.
Файлы DLL сравниваются с файлами EXE, но основное различие между ними заключается в том, что файлы DLL нельзя открывать и запускать напрямую, как EXE. Они очень полезны для программистов, поскольку им не нужно писать код с нуля и использовать предыдущий код для экономии времени и энергии.
Основные различия между LIB и DLL
- Файлы DLL можно использовать в разных программах, но файлы LIB нельзя использовать между программами.
- Производительность файлов также различается. Файлы DLL обеспечивают лучшую производительность во время выполнения программы. LIB, с другой стороны, требует больше времени для открытия, поскольку он соответствует файлам, когда они щелкают, а не статически, как LIB.
- В DLL можно напрямую ссылаться на свой ранее установленный код, но в LIB код должен быть скопирован человеком. Это дает DLL преимущество перед LIB.
- DLL совместим со многими файлами. Он не один, как другие, например, Pdf и т. д. LIB, с другой стороны, LIB, как правило, отрывается в большом большом файле.
- Из-за разных файлов в DLL могут возникнуть проблемы с управлением версиями, то есть с управлением этими различными файлами. Поскольку LIB представляет собой один большой файл, эта конкретная проблема не возникает.
Заключение
Программы зависят от типа файла, который им нужен для открытия различных файлов. Они оба требуют жизненно важного кода, чтобы открыть программу, и их следует редактировать и сохранять только с помощью подходящего программного обеспечения.
Нельзя просматривать эти файлы и тем более скачивать их из интернета, так как велика вероятность того, что они не подходят для конкретной программы или ноутбука и, самое главное, могут содержать в себе вирусы. В обычном компьютере эти файлы уже установлены, и искать их не нужно. Но, если когда-либо возникнет какая-либо проблема, следует обращаться только к сертифицированному разработчику или кодеру.
Эта статья покажет вам основы создания библиотек DLL с помощью MinGW, а затем связывания с ними в ваших приложениях. Код, который мы создадим здесь, можно будет использовать и в MSVC, поэтому вы или ваши конечные пользователи сможете использовать несколько компиляторов.
Основы DLL
DLL — это тип общей библиотеки, используемой в Microsoft Windows и OS/2, содержащей функции, которые можно повторно использовать в любом приложении, которое хочет их использовать (на самом деле библиотеки DLL могут содержать гораздо больше, чем просто функции, но эта статья о создании библиотек функций). Если у вас есть библиотека foo.dll, содержащая функцию DoWork() , DLL должна экспортировать эту функцию, чтобы ее можно было использовать в приложениях. Аналогичным образом, если приложение bar.exe хочет использовать функцию DoWork() , оно должно импортировать эту функцию из foo.dll ( также можно написать код, который загружает DLL после запуска приложения, вызывает функции из этой DLL, а затем выгружает DLL, когда она больше не нужна — так обычно работают системы плагинов/аддонов). Экспорт и импорт функций довольно прост и требует небольшого количества кода, сопровождаемого правильной командной строкой компоновщика.
Негибкий и неэлегантный способ
Сначала мы создадим DLL, экспортирующую только очень простую функцию, которая складывает два целых числа и возвращает результат. Обратите внимание на атрибут « __declspec(dllexport) » в приведенном ниже коде — это ключ к экспорту функций из DLL, и каждая функция, которую вы хотите экспортировать из DLL, должна быть помечена этим атрибутом (любые внутренние функции, которые не составляют часть вашего API следует оставить как есть). Также обратите внимание на « __cdecl » перед именем функции, который объявляет соглашение о вызовах для функции (см. статью в Википедии о соглашениях о вызовах x86, если вы с ними не знакомы). Соглашение о вызовах по умолчанию для функций C в MinGW — cdecl, но рекомендуется всегда явно указывать соглашение о вызовах на случай, если какой-то другой компилятор использует другое значение по умолчанию — если это произойдет, ваше приложение, скорее всего, будет работать некорректно. или сбой в результате вызова одной из этих функций. Обратите внимание, что этот первый пример намеренно негибкий и неэлегантный, чтобы точно показать, что происходит за кулисами. В следующем разделе мы будем скрывать эти детали с помощью определений препроцессора.
Чтобы скомпилировать это, просто необходимо передать опцию «-shared» в обычную командную строку компоновщика:
Никаких ошибок не должно быть сообщено, и теперь у вас должна быть пригодная для использования библиотека DLL. В этом примере я разделил этапы компиляции и компоновки, хотя для такого небольшого проекта это можно было бы сделать просто с помощью « gcc -o add_basic.dll -s -shared add_basic.c -Wl, --subsystem,windows ». «-Wl,--subsystem,windows» на самом деле не является необходимым, но просто общепринято, что библиотеки DLL имеют подсистему графического интерфейса Windows, указанную в их PE-заголовке. Также обратите внимание, что переключатель «-s» используется для удаления символов из DLL — вы, вероятно, захотите сделать это только для выпускных сборок.
Теперь вы можете создать приложение, использующее эту библиотеку DLL. Все, что необходимо для использования функции Add(a, b), — это объявить функцию с атрибутом «__declspec(dllimport)» перед ее использованием (обратите внимание, что это dllimport для клиентского приложения, в отличие от dllexport, используемого в нашей DLL).
Теперь вы можете скомпилировать и связать это приложение, просто сославшись на нашу DLL в командной строке компоновщика.
Параметр «-L» указывает дополнительную папку, в которой компоновщик должен искать библиотеку DLL. В этом случае мы хотим, чтобы компоновщик выполнял поиск в текущем каталоге, поэтому мы можем просто использовать точку, но для настоящей DLL, которую мы развернули в системе, мы будем использовать полный путь к ее каталогу. Параметр «-l» указывает DLL, из которой мы хотим импортировать функции — это должно быть имя файла DLL без расширения файла. Опять же, для такого небольшого проекта приложение можно было бы скомпилировать и слинковать, выполнив команду gcc -o addtest_basic.exe -s addtest_basic.c -L. -ladd_basic ”
Гибкий и элегантный способ
Обратите внимание, что мы определили «ADDAPI» как «__declspec(dllexport)», если определено «ADD_EXPORTS», или «__declspec(dllimport)» в противном случае. Именно это позволяет нам использовать один и тот же заголовок для приложений и DLL. Также обратите внимание, что мы определили «ADDCALL» как «__cdecl», что позволяет легко переопределить соглашение о вызовах, которое мы используем для нашего API. Теперь в любом месте нашего кода, где нам нужно экспортировать функцию из нашей DLL, мы указываем «ADDAPI» вместо атрибута «__declspec(dllexport)» и «ADDCALL» вместо указания, т. е. «__cdecl». Принято называть эти определения препроцессора «[имя библиотеки]_EXPORTS», «[имя библиотеки]API» и «[имя библиотеки]». ЗВОНИТЕ», поэтому рекомендуется придерживаться этого правила, чтобы ваш код был удобочитаемым для вас и других.
Помните, что этот код нельзя переносить, так как в нем используются атрибуты Microsoft. Здесь это нормально, потому что это руководство по созданию Windows DLL, но если вам нужна межплатформенная совместимость, то ADDAPI и ADDCALL можно определить условно. Обычно это делается так:
Код для DLL теперь может включать только что созданный заголовок, и единственное изменение, которое нам нужно сделать, это включить «ADDCALL» перед именем функции (здесь необходимо указать соглашение о вызовах, чтобы предотвратить возможные конфликты между объявление и определение функции).
Чтобы скомпилировать эту DLL, необходимо определить «ADD_EXPORTS» при компиляции объектного кода, чтобы обеспечить правильное определение «ADDAPI» в заголовке. Проще всего это сделать, передав «-D ADD_EXPORTS» в командной строке:
Для компиляции приложения не требуется никаких изменений в используемой нами командной строке:
Этот процесс сборки используется во многих реальных библиотеках. Если неясно, что происходит с определениями препроцессора, передайте «-save-temps» в командной строке gcc на этапе компиляции и просмотрите файлы с расширением «.i» — вы заметите, что в конечном итоге сгенерированный код как в элегантных, так и в неэлегантных примерах почти одинаково.
Экспорт и импорт переменных
В дополнение к функциям также можно экспортировать и импортировать переменные. Эти переменные должны быть объявлены как «extern __declspec(dllexport)» или «extern __declspec(dllimport)», в зависимости от того, строим ли мы DLL или клиентское приложение с использованием этих переменных. Как и в случае с функциями, мы можем использовать определения нашего препроцессора и просто выделить переменные «extern ADDAPI». Для переменных не следует указывать соглашение о вызовах.
Здесь мы добавили две экспортированные переменные в наш заголовочный файл, foo и bar.
Код DLL теперь включает присвоение значений нашим экспортируемым переменным:
Приложение было изменено таким образом, что теперь оно добавляет импортированные переменные foo и bar вместе, выводя результат:
Если вы измените значения foo и bar, перекомпилируете DLL и снова запустите приложение, вы увидите, что переменные действительно импортированы из DLL.
Импорт библиотек
Хотя обычно можно связать DLL, просто имея DLL в вашей системе и добавив некоторые параметры командной строки компоновщика, это не всегда желательно.В этом случае вместо этого следует использовать библиотеку импорта. Библиотека импорта не содержит кода, но содержит всю необходимую информацию, необходимую вашему приложению для поиска функций, экспортируемых DLL. При создании библиотек для использования третьими лицами я бы рекомендовал всегда создавать библиотеку импорта и распространять ее вместе с вашими файлами DLL и заголовочными файлами, поскольку вашим пользователям может потребоваться создавать свои приложения с использованием библиотек импорта.< /p>
Если вы изменили имена функций, экспортируемых библиотекой DLL (см. «Предупреждение об экспорте функций stdcall» ниже), единственным вариантом является библиотека импорта. Это относится к API Windows, где вы должны связать свои приложения с помощью библиотек импорта, т. е. передать «-lgdi32 -luser32» и т. д. в командной строке компоновщика при компиляции программ с графическим интерфейсом Windows.
Создание и использование библиотеки импорта
Если вы не изменили ни одно из имен функций, экспортируемых DLL, то создание библиотеки импорта — это всего лишь случай передачи дополнительного параметра «-Wl,--out-implib,lib[имя библиотеки ].a ” в командную строку компоновщика.
Принято использовать имя библиотеки в имени библиотеки импорта. Обязательно, чтобы имя файла начиналось с «lib» и заканчивалось расширением «.a», чтобы его можно было использовать (на самом деле есть несколько поддерживаемых соглашений об именах, которые вы можете использовать, которые описаны в руководстве, но все остальное не подходит). не работает).
Сборка приложения такая же, как и раньше, но вместо того, чтобы передавать каталог, содержащий DLL, компоновщику, вместо этого вы передаете каталог, содержащий библиотеку импорта (на самом деле мы все еще делаем все из текущего каталога, но это, вероятно, не было бы случаем для реального приложения). Чтобы связать DLL, вы передаете имя библиотеки импорта без префикса lib и расширения файла.
Обычно библиотеки DLL помещаются в папку с именем «bin», а библиотеки импорта — в папку с именем «lib», например, «C:\Program Files\Add\bin\» и «C:\Program Files\Add\». библиотека\ ".
Предупреждение об экспорте функций стандартного вызова
Одна вещь, о которой вы должны знать при объявлении функций « __stdcall », заключается в том, что MinGW и MSVC экспортируют свои функции с немного разными именами (декорациями функций). Для нашего примера с добавлением выше MSVC экспортирует функцию «Add(int a, int b)» с именем «_Add@8» (подчеркивание, имя функции, знак at, размер аргументов в байтах), тогда как MinGW экспортирует ее. как «Add@8» (то же, что и MSVC, но без подчеркивания). Поэтому, если вы хотите иметь бинарную совместимость между сборками MinGW и MSVC вашей DLL, необходимо изменить имена экспортируемых функций. Это немного сложнее, чем я собираюсь охватить в этой статье, но я написал статью Advanced MinGW DLL Topics, в которой объясняется, как это сделать, а также некоторые подводные камни, на которые следует обратить внимание.
Добавление информации о версии и комментариев к вашей DLL
Если вы просмотрите свойства DLL с помощью проводника Windows и перейдете на вкладку «Подробности», вы, скорее всего, увидите информацию о DLL, такую как версия, автор, авторские права и описание библиотеки. Это приятное прикосновение к DLL (особенно полезно, когда вы хотите знать, какая версия DLL установлена на вашем ПК), и это довольно просто добавить в вашу DLL. Все, что вам нужно сделать, это создать ресурс версии, например следующий:
Я не буду вдаваться в подробности того, что означает каждый из этих элементов, так как они очень хорошо описаны в MSDN, но большая часть из них не требует пояснений (в любом случае я рекомендую прочитать статью MSDN, особенно если язык американский английский или любой другой, кроме британского английского).
Идея состоит в том, чтобы скомпилировать сценарий ресурсов с помощью windres.exe, а затем передать его компоновщику при связывании библиотеки DLL. Например, если ваш ресурсный скрипт называется «resource.rc»:
Это все, что нужно сделать, чтобы добавить информацию о версии в DLL. Стоит потратить время на то, чтобы сделать это для любых DLL, которые вы выпускаете, так как это полезно и придает вашему приложению профессиональный вид.
Собираем все вместе
Используя информацию из этой статьи, вы теперь сможете собрать все воедино и создать библиотеки DLL с помощью MinGW, а также исполняемые файлы, использующие функции, экспортированные из библиотек DLL. Чтобы помочь вам, я создал небольшой проект, который создает DLL со следующими функциями:
- Экспортировано “ int Add(int a, int b); ”, используя соглашение о вызовах cdecl.
- Экспортированные переменные «foo» и «bar».
- Ресурс информации о версии, встроенный в библиотеку DLL.
Кроме того, будет создан исполняемый файл, который выводит результат сложения, используя экспортированную функцию и экспортированные переменные. Проект можно собрать с помощью утилиты mingw32-make.
Вы можете загрузить пример DLL MinGW с GitHub, чтобы создать пример DLL и приложения из этой статьи.Вы можете либо клонировать репозиторий с помощью git, либо загрузить пример выпуска MinGW DLL. Вы можете использовать его для любых целей, которые посчитаете нужными (полные условия использования см. в «License.txt»). Используя файлы проекта, вы можете легко создать пример из этой статьи и использовать его в качестве основы для своих собственных библиотек DLL и приложений.
Что нужно знать
Еще один момент, о котором следует помнить, это то, что если вы передаете структуры в функцию, экспортированную из библиотеки DLL, или возвращаете структуру из этой функции, вы не сможете позже изменить определение этой структуры. Внесение таких изменений, скорее всего, приведет к сбою старых приложений или к непредусмотренному поведению, поскольку расположение памяти структуры изменилось с момента компиляции приложения. Невозможно изменить определение структуры, не нарушая обратной совместимости, но это тоже не элегантно. Например, в Windows API часто бывает, что структуры имеют член (на первый взгляд бессмысленный), который указывает размер структуры, новые члены добавляются в конце определения структуры и передаются в функции по адресу, а не по значению (для пример структуры OPENFILENAME). Это те вещи, которые позволяют Windows API изменяться между выпусками Windows, не нарушая обратной совместимости (я знаю, что люди могут сказать, что каждая версия Windows вызывает много проблем с обратной совместимостью, но факт в том, что хорошо написанное приложение, созданное для Windows 95 имеет хорошие шансы работать на последних версиях Windows, что, на мой взгляд, весьма впечатляет).
Похожие страницы
Дополнительные темы по созданию библиотек DLL с помощью MinGW, включая классы JNI, P/Invoke и C++.
Как создать полнофункциональное приложение Windows с графическим интерфейсом с помощью компилятора MinGW.
Как создавать приложения OpenGL для Windows с помощью библиотек freeglut или GLUT для Win32 и компилятора MinGW.
©2001–2018 Transmission Zero. Все права защищены. Конфиденциальность и файлы cookie.
LIB и DLL
При разработке программного обеспечения нас часто спрашивают, хотим ли мы использовать LIB или библиотеки DLL для хранения функций приложения. LIB — это статическая библиотека, в которую можно помещать и вызывать функции и процедуры во время компиляции приложения. DLL или библиотека динамической компоновки выполняют ту же функцию, но являются динамическими в том смысле, что приложение может вызывать эти библиотеки во время выполнения, а не во время компиляции. Это дает несколько существенных преимуществ по сравнению с использованием LIB.
Для начала у вас будет один файл значительно большего размера, так как он содержит весь код, а при использовании DLL у вас будет несколько файлов меньшего размера. Компиляция ваших функций и процедур также обеспечит вам больше возможностей для повторного использования, поскольку, как только вы будете довольны функциями в DLL, потому что вы можете оставить их как есть с каждой версией приложения, и вам не придется возиться с ними. Вы также можете использовать ту же DLL, если хотите создать другое приложение, использующее те же функции и процедуры. Вы можете напрямую ссылаться на DLL, а не копировать код из исходного кода, как в случае с LIB.
Проблема с DLL возникает при изменении содержимого DLL. Это может привести к проблемам с версиями, когда приложение использует неправильную версию DLL, вызывающую проблемы. Вам нужно следить за своими DLL, чтобы избежать этих проблем. У вас не будет этой проблемы с LIB, так как вы получите только один большой файл.
При разработке программного обеспечения и выборе DLL в вашем проекте по-прежнему будет файл LIB. Но в отличие от использования LIB, этот файл не содержит код функций и процедур, а только заглушки, необходимые программе для вызова процедур из DLL.
Вывод:
1. DLL — это библиотека, содержащая функции, которые могут вызываться приложениями во время выполнения, а LIB — это статическая библиотека, код которой необходимо вызывать во время компиляции
2. Использование LIB приведет к тому, что один файл будет значительно больше, в то время как вы получите несколько файлов меньшего размера с DLL
3. DLL более пригодны для повторного использования, чем LIB, при написании новых версий или совершенно новых приложений
4. Файлы DLL могут использоваться другими приложениями, в то время как файлы LIB не могут
5. DLL склонны к проблемам с версиями, в то время как LIB не
6. У вас все равно будет файл LIB при разработке программного обеспечения с DLL, но он содержит только заглушки
Читайте также: