Как подключить dll к проекту c

Обновлено: 21.11.2024

В этом примере показано, как создать и настроить простой проект Microsoft® Visual Studio®, который вызывает динамическую библиотеку (DLL), созданную MATLAB® Coder™. В примере используется Microsoft Visual Studio 2017. В других версиях Microsoft Visual Studio вы можете столкнуться с другой процедурой.

Создание динамической библиотеки C

Создайте функцию MATLAB foo .

Сохраните его как foo.m в локальной папке, доступной для записи, например, C:\dll_test .

Используйте ту же версию того же компилятора для создания библиотеки DLL, которую вы используете для создания проекта Microsoft Visual Studio. В противном случае вы можете столкнуться с ошибками связывания.

В этом примере используйте компилятор Microsoft Visual Studio 2017. Чтобы выбрать компилятор, который использует генератор кода, введите mex -setup в командной строке. Дополнительные сведения см. в разделе Поддерживаемые и совместимые компиляторы.

Сгенерируйте DLL для функции MATLAB foo . Параметр -args указывает, что ввод a является реальным двойным значением.

В системах Microsoft Windows ® codegen создает динамическую библиотеку C, foo.dll , и вспомогательные файлы в папке по умолчанию, C:\dll_test\codegen\dll\foo .

Создание проекта Microsoft Visual Studio

В Microsoft Visual Studio создайте пустой проект:

Выберите «Файл» > «Создать» > «Проект».

Выберите Установлено > Visual C++ > Общие и выберите Пустой проект. Введите название проекта.

Нажмите "ОК".

Создайте файл main.c, использующий библиотеку

Напишите файл main.c, использующий foo.dll . Функция main.c должна:

Включите сгенерированные файлы заголовков, которые содержат прототипы функций для библиотечных функций.

Вызовите функцию завершения после последнего вызова библиотечной функции.

По умолчанию генератор кода включает вызов функции инициализации в начале сгенерированных функций точки входа C/C++. Таким образом, вам не нужно вызывать функцию инициализации из main.c. См. раздел Использование сгенерированных функций инициализации и завершения.

Чтобы создать файл:

В обозревателе решений щелкните правой кнопкой мыши папку «Исходные файлы» и выберите «Добавить» > «Новый элемент».

Выберите файл C++ (.cpp). В поле Имя введите main.c .

Нажмите "Добавить".

Настройка платформы

MATLAB Coder автоматически использует цепочку инструментов, сконфигурированную для создания 64-разрядной библиотеки DLL. По умолчанию Microsoft Visual Studio настроена на сборку для платформы Win32. Вы должны изменить платформу сборки на x64, чтобы она соответствовала созданной 64-разрядной DLL. В Microsoft Visual Studio:

Выберите Сборка > Диспетчер конфигураций.

Установите для платформы активного решения значение x64.

Если вы хотите создать 32-разрядную библиотеку DLL на 64-разрядной платформе, необходимо использовать 32-разрядное определение цепочки инструментов. См. раздел Создание 32-разрядной библиотеки DLL на 64-разрядной платформе Windows® с помощью набора инструментов MSVC.

Указать внешние зависимости

Для сборки проекта компилятору требуются соответствующие заголовочные файлы. Компоновщику требуются сгенерированные файлы .lib.

Выделите свой проект в обозревателе решений и выберите "Проект" > "Свойства".

Генератор кода создает типы в файле rtwtypes.h, который включает файл tmwtypes.h. Этот файл хранится в matlabroot \extern\include , где matlabroot — это корневой каталог установки MATLAB. Чтобы вернуть корневой каталог, введите matlabroot в командном окне.

В разделе «Свойства конфигурации» > «C/C++» > «Общие» добавьте папки C:\dll_test\codegen\dll\foo и matlabroot \extern\include в дополнительные каталоги включения. Разделяйте записи точкой с запятой.

В разделе «Свойства конфигурации» > «Компоновщик» > «Ввод» добавьте foo.lib в «Дополнительные зависимости».

В разделе «Свойства конфигурации» > «Компоновщик» > «Общие» добавьте папку C:\dll_test\codegen\dll\foo в дополнительные каталоги библиотек.

Сборка и запуск исполняемого файла

Создайте исполняемый файл. Выберите «Сборка» > «Создать решение».

Сделайте DLL доступной для исполняемого файла. Либо скопируйте foo.dll в папку, содержащую исполняемый файл, либо добавьте папку, содержащую foo.dll, в свой путь.

В Windows библиотека динамической компоновки (DLL) представляет собой разновидность исполняемого файла, который действует как общая библиотека функций и ресурсов. Динамическое связывание — это возможность операционной системы. Он позволяет исполняемому файлу вызывать функции или использовать ресурсы, хранящиеся в отдельном файле. Эти функции и ресурсы можно скомпилировать и развернуть отдельно от исполняемых файлов, которые их используют.

DLL не является автономным исполняемым файлом. Библиотеки DLL работают в контексте приложений, которые их вызывают. Операционная система загружает DLL в пространство памяти приложения. Это делается либо при загрузке приложения (неявное связывание), либо по запросу во время выполнения (явное связывание). DLL также упрощают совместное использование функций и ресурсов между исполняемыми файлами. Несколько приложений могут одновременно обращаться к содержимому одной копии DLL в памяти.

Различия между динамической и статической ссылками

Статическое связывание копирует весь объектный код из статической библиотеки в исполняемые файлы, которые используют его при создании. Динамическое связывание включает только ту информацию, которая необходима Windows во время выполнения для поиска и загрузки библиотеки DLL, содержащей элемент данных или функцию. При создании DLL вы также создаете библиотеку импорта, содержащую эту информацию. Когда вы создаете исполняемый файл, который вызывает DLL, компоновщик использует экспортированные символы в библиотеке импорта, чтобы сохранить эту информацию для загрузчика Windows. Когда загрузчик загружает DLL, DLL отображается в пространство памяти вашего приложения. Если присутствует, вызывается специальная функция в DLL, DllMain , для выполнения любой инициализации, требуемой DLL.

Различия между приложениями и библиотеками DLL

Несмотря на то, что библиотеки DLL и приложения являются исполняемыми модулями, у них есть несколько отличий. Самое очевидное отличие состоит в том, что вы не можете запускать DLL. С точки зрения системы между приложениями и библиотеками DLL есть два фундаментальных различия:

Приложение может иметь несколько экземпляров, работающих в системе одновременно. DLL может иметь только один экземпляр.

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

Преимущества использования библиотек DLL

Динамическая привязка к коду и ресурсам имеет ряд преимуществ по сравнению со статической привязкой:

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

Динамическое связывание экономит дисковое пространство и пропускную способность. Многие приложения могут совместно использовать одну копию DLL на диске. Напротив, каждое приложение, созданное с использованием статической библиотеки ссылок, имеет код библиотеки, связанный с ее исполняемым образом. Это занимает больше места на диске и требует большей пропускной способности для передачи.

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

Для послепродажной поддержки можно использовать библиотеки DLL. Например, библиотеку DLL драйвера дисплея можно изменить, чтобы она поддерживала дисплей, который был недоступен при поставке приложения.

Вы можете использовать явное связывание для обнаружения и загрузки библиотек DLL во время выполнения. Например, расширения приложений, которые добавляют новые функции в ваше приложение без его перестройки или повторного развертывания.

Динамическое связывание упрощает поддержку приложений, написанных на разных языках программирования. Программы, написанные на разных языках программирования, могут вызывать одну и ту же функцию DLL, если программы следуют соглашению о вызовах функций. Программы и функция DLL должны быть совместимы по следующим параметрам: Порядок, в котором функция ожидает, что ее аргументы будут помещены в стек. Отвечает ли функция или приложение за очистку стека. И передаются ли какие-либо аргументы в регистрах.

Динамическое связывание предоставляет механизм расширения классов библиотеки Microsoft Foundation Class library (MFC). Вы можете получить классы из существующих классов MFC и поместить их в библиотеку DLL расширения MFC для использования приложениями MFC.

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

Потенциальным недостатком использования библиотек DLL является то, что приложение не является автономным. Это зависит от наличия отдельного модуля DLL: того, который вы должны развернуть или проверить самостоятельно в процессе установки.

Подробнее о том, как создавать и использовать библиотеки DLL

В следующих статьях содержится подробная информация о том, как создавать библиотеки DLL C/C++ в Visual Studio.

Пошаговое руководство. Создание и использование библиотеки динамической компоновки (C++)
Описывает создание и использование библиотеки DLL с помощью Visual Studio.

Виды библиотек DLL
Информация о различных типах библиотек DLL, которые можно создать.

Часто задаваемые вопросы о библиотеках DLL
Содержит ответы на часто задаваемые вопросы о библиотеках DLL.

Связать исполняемый файл с библиотекой DLL
Описывает явное и неявное связывание с библиотекой DLL.

Инициализировать DLL
Обсуждается код инициализации DLL, который должен выполняться при загрузке DLL.

Поведение DLL и библиотеки времени выполнения Visual C++
Описывает последовательность запуска DLL библиотеки времени выполнения.

LoadLibrary и AfxLoadLibrary
Обсуждается использование LoadLibrary и AfxLoadLibrary для явного связывания с библиотекой DLL во время выполнения.

GetProcAddress
Обсуждается использование GetProcAddress для получения адреса экспортируемой функции в DLL.

FreeLibrary и AfxFreeLibrary
Обсуждается использование FreeLibrary и AfxFreeLibrary, когда модуль DLL больше не нужен.

Порядок поиска библиотеки Dynamic-Link
Описывает путь поиска, который операционная система Windows использует для поиска библиотеки DLL в системе.

Состояния модуля обычной библиотеки DLL MFC, динамически связанной с MFC.
Описывает состояния модуля обычной библиотеки DLL MFC, динамически связанной с MFC.

Библиотеки расширения MFC
Описывает библиотеки DLL, которые обычно реализуют повторно используемые классы, производные от существующих классов MFC.

Создание библиотеки DLL только для ресурсов
Обсуждается библиотека DLL только для ресурсов, которая не содержит ничего, кроме ресурсов, таких как значки, растровые изображения, строки и диалоговые окна.

Локализованные ресурсы в приложениях MFC: вспомогательные библиотеки DLL
Обеспечивает расширенную поддержку вспомогательных библиотек DLL, которая помогает создавать приложения, локализованные для нескольких языков.

Импорт и экспорт
Описывает импорт общедоступных символов в приложение или экспорт функций из DLL

Активная технология и библиотеки DLL
Позволяет реализовать объектные серверы внутри библиотеки DLL.

Автоматизация в DLL
Описывает, что предоставляет параметр автоматизации в мастере DLL MFC.

Соглашения об именах для библиотек DLL MFC
Обсуждается, как библиотеки DLL и библиотеки, включенные в MFC, следуют структурированному соглашению об именах.

Вызов функций DLL из приложений Visual Basic
Описывает, как вызывать функции DLL из приложений Visual Basic.

Связанные разделы

Использование MFC как части библиотеки DLL
Описывает обычные библиотеки DLL MFC, которые позволяют использовать библиотеку MFC как часть библиотеки динамической компоновки Windows.

Версия DLL MFC
Описывает, как можно использовать общие библиотеки динамической компоновки MFCxx.dll и MFCxxD.dll (где x — номер версии MFC) с приложениями MFC и библиотеками DLL расширений MFC.

Я понимаю, что мне нужно использовать LoadLibrary(). Но какие еще шаги мне нужно предпринять, чтобы использовать сторонний DLL-файл?

Я просто перешел на C++, и это единственная часть, которую я не понимаю (как Java-программист). Я просто изучаю, как я могу использовать библиотеку Qt и tesseract-ocr, но этот процесс не имеет для меня никакого смысла, и его так сложно найти в Google.

Как мне сообщить компилятору о функциях, которые я использую? Должен ли быть включаемый файл от стороннего поставщика?

Знаете ли вы, как добавить сторонний DLL-файл в Visual Studio 2012 для C++. Пожалуйста, помогите мне с этим.

6 ответов 6

Как все говорят, LoadLibrary — сложный способ сделать это, и вряд ли когда-либо понадобится.

Для связывания с библиотекой может потребоваться добавить файл .lib в конфигурацию проекта в разделе Linker/Input/Additional Dependencies.

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

Диалоговое окно «Дополнительные зависимости» выглядит так, как будто оно поддерживает только имена файлов и расширения, а не пути к файлам. Добавление имени файла + расширения не исправило ошибки «идентификатор не найден». Добавление полного пути + имени файла + также не помогло.

@advocate, на вкладке "Общие" есть запись "Дополнительные каталоги библиотек". Я понятия не имею, почему Microsoft их разделила.

Я так и сделал, но по-прежнему получаю ошибки компоновщика. Я поместил свой файл .dll в папку C:/Windows. Что я делаю не так?

Чтобы включить сторонние библиотеки DLL в мой проект VS 2008 C++, я сделал следующее (вы должны быть в состоянии перевести в 2010, 2012 и т. д.).

Я поместил заголовочные файлы в свое решение вместе с другими заголовочными файлами, внес изменения в свой код для вызова функций DLL (иначе зачем нам все это делать?). :^) Затем я изменил сборку, чтобы связать код LIB с моим EXE, скопировать библиотеки DLL на место и очистить их, когда я сделал «чистку» - я объясню эти изменения ниже.

Предположим, что у вас есть две библиотеки DLL сторонних производителей, A.DLL и B.DLL, и у вас есть заглушки для каждого файла LIB (A.LIB и B.LIB) и файлы заголовков (AH и BH).

  • Создайте каталог "lib" в каталоге вашего решения, например с помощью Проводника Windows.
  • Скопируйте сторонние файлы .LIB и .DLL в этот каталог

(Следующий набор изменений необходимо будет внести один раз для каждой цели исходной сборки, которую вы используете (Отладка, Выпуск).)

С помощью DLL (библиотека динамической компоновки) мы можем сделать наш проект модульным и сократить время разработки. DLL повышает производительность проекта и способствует повторному использованию кода. Это также помогает разработчику беспрепятственно вставлять и удалять новые функции в проекте.


По сути, DLL — это совместно используемая библиотека, которая содержит код и данные, используемые более чем одной программой одновременно, и, как и исполняемый файл, DLL не может запускаться напрямую. DLL (библиотека динамической компоновки) вызывается приложением.

Например, в Windows файл Kernel32.dll отвечает за управление памятью, операции ввода/вывода и прерывания.

ПРОМОКОД - PROMOTION25

Наиболее важные функции библиотеки DLL: она загружается во время выполнения, когда приложение запрашивается для функциональности библиотеки DLL, и время загрузки очень мало.

В этой статье я научу вас, как создать DLL на C++ и как использовать эту DLL в приложении C++.

Шаги по созданию DLL на C++

Здесь я опишу, как создать проект DLL на C++ с помощью Visual Studio.

  • Откройте визуальную студию и щелкните строку меню, чтобы создать новый проект. См. изображение ниже.

  • После выбора нового проекта откроется новое диалоговое окно, в котором выберите тип проекта Win32 и дайте имя проекту DLL.

  • На странице "Обзор" диалогового окна мастера приложений Win32 нажмите кнопку "Далее". После нажатия следующей кнопки откроется новое окно. Это окно настройки приложения, здесь мы выберем тип приложения и нажмем кнопку «Готово», чтобы создать проект DLL.

  • После создания проекта DLL вы должны добавить файлы заголовков и исходный файл в соответствии с вашими требованиями. Здесь я добавляю только один заголовочный файл (Calculation.h).

  • Когда вы создали файл заголовка, напишите желаемое содержимое в соответствии с требованиями. Здесь я создаю библиотеку, которая выполняет некоторые основные арифметические операции, такие как сложение, вычитание и умножение.

Примечание. Когда вы создали проект DLL, PROJECTNAME_EXPORTS автоматически определяется в символах препроцессора проекта DLL. В этом примере CALCULATIONDLL_EXPORTS определяется при построении проекта CALCULATIONDLL DLL.

  • Пришло время определить функцию члена класса в исходном файле. Здесь я определяю все функции-члены в файле CalculationDll.CPP.
  • Теперь исходные файлы и файлы заголовков добавляются в проект DLL, чтобы создать DLL и библиотеку, просто создайте проект DLL. Если все в порядке и ваш проект DLL компилируется без каких-либо ошибок, то будут созданы файлы DLL и .lib.

Этапы создания приложения C++

Здесь я создаю приложение C++, которое будет использовать созданную DLL.

  • Нажмите на строку меню, чтобы создать новый проект приложения C++, в котором используется DLL, которую я только что создал.

  • После выбора нового проекта откроется новое диалоговое окно, в котором выберите тип проекта Консольное приложение Win32 и дайте имя проекту приложения.

  • На странице "Обзор" диалогового окна мастера приложений Win32 нажмите кнопку "Далее". После нажатия следующей кнопки откроется новое окно. Это окно настроек приложения, здесь мы выберем тип приложения и нажмем кнопку «Готово», чтобы создать проект консольного приложения c++.

Теперь ваш проект приложения C++ готов к использованию DLL (библиотека динамической компоновки).

Как связать DLL с приложением C++

Здесь я обсуждаю простые шаги по связыванию проекта DLL с проектом приложения C++.

  • Когда мы создали DLL и приложение, после этого мы должны сослаться на DLL с приложением, которое позволяет приложению использовать функцию DLL в соответствии с требованием. Для этого в проекте CalculationApplication в обозревателе решений выберите элемент Ссылки. В строке меню выберите "Проект", "Добавить ссылку".

  • При нажатии кнопки "Добавить новую ссылку" откроется диалоговое окно со списками библиотек, на которые вы можете ссылаться. Вам нужно просто нажать на кнопку галочки в нужной библиотеке. Здесь в диалоговом окне отображается только одна библиотека.

  • Теперь ваша созданная библиотека связана с созданным приложением, но перед использованием DLL в приложении вы должны добавить заголовочный файл DLL. Есть два способа выполнить эту задачу: один из них — скопировать заголовочный файл DLL в ваш проект приложения, но это может привести к изменениям в одной копии, которые не отразятся в другой. Это небезопасный способ, поэтому мы следуем второму способу, в котором мы просто ссылаемся на файл заголовка DLL, чтобы указать путь к исходным файлам заголовков DLL в пути к каталогам, включенным в проект приложения.

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

В приведенном ниже коде приложения я просто вызываю функцию вычисления DLL для выполнения сложения, вычитания и умножения.

В этой статье мы обсудим использование библиотеки динамической компоновки (DLL) на простом примере. Эти библиотеки содержат код и данные, которые могут использоваться сторонними приложениями. Используя DLL, мы сможем продвигать повторное использование кода и эффективное использование памяти. Этот метод также позволит нам разбивать программы на отдельные компоненты, каждый из которых можно использовать по мере необходимости.

Файл DLL (Библиотека динамической компоновки) – это тип файла, который содержит данные и инструкции, которые используются другими программами и могут вызываться при необходимости. Файлы DLL позволяют нескольким программам одновременно использовать функции и классы. В отличие от исполняемых программ, файлы DLL нельзя запускать напрямую, вместо этого они должны вызываться какой-либо другой программой.

Слово «динамический» используется для объяснения того, что данные не всегда доступны в памяти, они используются только тогда, когда программа активно их запрашивает. Файлы DLL позволяют разделить программу на несколько уникальных компонентов, которые затем можно добавлять или удалять, чтобы включить или исключить определенные функции. Это очень полезно, потому что снижает использование памяти, поскольку программе не нужно загружать все сразу.

Microsoft Visual C++ предоставляет несколько расширений стандартного C++, которые позволяют указывать функции и классы как импортируемые или экспортируемые непосредственно в коде C++. Эти расширения используют атрибут __declspec перед объявлением функции или класса.

Обратите внимание, что при доступе к функциям или классам C из C++ функции должны быть объявлены как extern "C" в коде C++, чтобы компилятор не искажал функции или классы, а использовать соединение «С». Поскольку C++ поддерживает перегрузку функций, мы можем объявить несколько функций с одинаковыми именами и разными параметрами. Затем нам нужно предоставить компилятору дополнительную информацию об именах функций, чтобы избежать ошибок неопределенных ссылок или ошибок связывания (поскольку C не поддерживает перегрузку функций).

Решение здесь состоит в том, чтобы указать extern «C» в нашей программе на C++. Когда компилятор находит внешний блок «C», он гарантирует, что имена функций не искажены — что компилятор создает двоичный файл с их именами без изменений, как это сделал бы компилятор «C». Эта дополнительная информация позволяет нам избежать проблем с компоновкой и конфликтов в двоичном коде.

В приведенном ниже примере используется Visual Studio 2019 для создания и построения простой библиотеки DLL:

Откройте Visual Studio и создайте новый проект. Чтобы указать, что это DLL, нам нужно будет выбрать «Библиотека динамической компоновки с экспортом (DLL)»

После выбора имени для нашего проекта и места сохранения. Мы идем дальше и открываем созданную папку «Файлы заголовков» (файл [ProjectName].h):

Файл заголовка будет использоваться для объявления всех наших классов и функций. Во-первых, мы определяем макрос C++, который экспортирует функции для сторонних приложений (Unity), которые будут использовать DLL для доступа к функциям и классам. Этот блок называется условной группой.

Мы можем удалить примеры классов и функций, так как мы будем писать собственные функции для тестирования.

Мы создаем три простые функции. Первый отображает число, второй отображает случайное число, а третий добавляет два числа.

Обратите внимание, что мы используем внешний «C», чтобы избежать искажения имени, как обсуждалось выше.

В обозревателе решений откройте файл [ProjectName.cpp]:

Теперь у нас есть тестовые функции. Давайте построим наше решение, но прежде нам нужно убедиться, что мы собираем его для правильной ожидаемой 64-битной архитектуры. Нам нужно скомпилировать наши библиотеки для платформы x64 (64-бит). Чтобы изменить это в Visual Studio, мы можем перейти в диспетчер конфигураций и выбрать x64 в разделе «Платформа». Или просто выберите x64 в раскрывающемся меню вверху.

Наше решение успешно построено

Чтобы легко получить доступ к сгенерированным библиотекам DLL, щелкните правой кнопкой мыши решение в обозревателе решений и выберите «Открыть папку в проводнике»

Читайте также: