Как создать библиотеку dll в c visual studio

Обновлено: 21.11.2024

Следующая процедура предназначена для создания программы C с библиотекой динамической компоновки с помощью Microsoft Visual Studio Express 2012.

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

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

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

Чтобы создать библиотеку динамической компоновки
Шаг 1: Создайте новый проект как библиотеку динамической компоновки
Создайте новый проект, используя MyMathDll в качестве имени проекта

Нажмите "ОК". Затем нажмите «Далее». На следующем экране вам нужно указать, что вы создаете DLL, и убедитесь, что вы отметили Пустой проект.

Добавьте в заголовки следующее:

Атрибуты dllexport и dllimport являются расширениями для C и C++. Вы можете использовать их для экспорта и импорта функций в DLL или из нее. Когда символ MYMATHDLL_EXPORTS определен, символ MYMATHDLL_API устанавливает модификатор __declspec(dllexport) в объявлениях функций-членов. Это позволяет экспортировать функцию из библиотеки DLL, чтобы ее можно было использовать в других приложениях. Когда MYMATHDLL_EXPORTS не определен, MYMATHDLL_API определяет модификатор __declspec(dllimport) в объявлениях функций-членов. Это позволяет компилятору оптимизировать импорт функции из DLL для использования в других приложениях. По умолчанию MYMATHDLL_EXPORTS определяется при сборке проекта MyMathDll.

Шаг 3. Создайте программу внедрения

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

Введите исходный код следующим образом


Шаг 4. Создание решений

Создавайте решения. У вас должен получиться следующий результат:

Создание прикладной программы C с помощью DLL
Шаг 1: Создайте новый проект

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

Перейдите к папкам проекта MyMathDll, выберите файл проекта MyMathDll.vcxproj и нажмите "Открыть".

В обозревателе решений должны отображаться два проекта, как показано ниже:

Выберите MyApp3, щелкните правой кнопкой мыши и выберите свойства. В разделе «Общие свойства» выберите «Платформа и ссылки». Нажмите "Добавить новую ссылку"

Вы должны увидеть следующий экран, там должен быть проект с именем "MyMathDll". Проверьте проект, как показано ниже, и нажмите "ОК".

На странице свойств в разделе Свойства конфигурации >> C/C++ разверните список в C/C++ и выберите "Общие", как показано ниже.

Для первой строки «Дополнительные каталоги включения» нажмите стрелку и выберите «Изменить». Появится следующее диалоговое окно:

Нажмите значок «Новая строка» и нажмите кнопку «.». Теперь вам нужно перейти в папку DLL. Не выбирайте папку «MyMathDll» в разделе «Проекты», перейдите на один уровень вниз и выберите папку «MyMathDll». Цель состоит в том, чтобы выбрать папку, содержащую заголовочный файл. Выделите папку и нажмите «Выбрать папку».

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

Введите следующую программу:

Шаг 4. Создайте решение.

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

Дополнительное примечание:

Обратите внимание, что для успешного выполнения программы. MyApp3.exe и MyMathDll.dll должны находиться в одной папке. В качестве альтернативы MyMathDll.dll должен находиться там, где система Windows может его найти. Путь поиска файлов DLL для Windows следующий:

  1. Каталог, в котором находится исполняемый файл.
  2. Системный каталог Windows.
  3. Каталог Windows.
  4. Каталоги, перечисленные в переменной среды PATH.


На этом процедура создания DLL на C с помощью Visual Studio Express 2012 завершена. Обратите внимание, что процедура создания аналогичной DLL с помощью командной строки отличается от процедуры с использованием IDE.

  • Получить ссылку
  • Фейсбук
  • Твиттер
  • Pinterest
  • Электронная почта
  • Другие приложения

Комментарии

Это был очень полезный пошаговый процесс. Отличная помощь. Большое спасибо.

Спасибо за пошаговое руководство!
Я боролся с проблемой .DLL в течение нескольких дней, и теперь, найдя ваш пост, это было сделано менее чем за час!
Еще раз спасибо

Оставить комментарий

Популярные записи из этого блога

Установка и настройка RealVNC в Linux Ubuntu 18.04 LTS

RealVNC — это коммерческая компания, которая продает лицензию VNC для корпоративного рынка. Однако компания позволяет домашнему пользователю настроить сервер VNC для личного использования. Ограничение состоит в том, что вы разрешаете только 5 подключений. Пользователь должен зарегистрировать идентификатор в компании. Конфигурация вашего VNC будет храниться на сервере компании. Поскольку RealVNC производится профессионально, он намного лучше по сравнению с продуктом с открытым исходным кодом в Linux. Основным преимуществом является простота настройки, хотя есть шаги по установке и запуску сервера, особенно на платформе Linux. Нам не нужно беспокоиться об IP-адресе и номере порта. То, что требуется серверу и клиенту, — это наш идентификатор RealVNC, который мы создали. В отличие от сервера Vino по умолчанию, который поставляется с Ubuntu, RealVNC запустится без входа пользователя в систему. Система создана с учетом требований безопасности. Шифрование выполняется прозрачно без какого-либо вмешательства со стороны пользователя. Мы покажем простое руководство по установке и настройке RealVNC Connect (serv

Настройка автоматических обновлений на Raspberry Pi

Возродите старый Mac Mini (2009 г.) с Linux

У нас есть старый Mac Mini (версия конца 2009 года). Последней Mac OS X, которую он мог поддерживать, была Mac OS X El Capitan. Машина по-прежнему хороша, хотя DVD-привод больше не работает. Apple очень скоро выпустит обновление безопасности для El Capitan. Запуск OS X El Capitan без каких-либо обновлений безопасности невозможен. Вместо того, чтобы избавляться от хорошего оборудования, мы можем установить Linux. Однако, прежде чем мы начнем играть с установкой Linux, нам нужно оценить возможности оборудования. Возможно, нам потребуется обновить некоторое оборудование, чтобы мы могли без проблем запускать Linux. Спецификация Mac Mini 2009 Этот Mac оснащен процессором Core 2 Duo (P8700), работающим на частоте 2,53 ГГц. Он поддерживает оперативную память PC3-8500 DDR3, работающую на частоте 1066 МГц. В этом Mac Mini установлена ​​видеокарта Nvidia Geforce 9400M. Он поддерживает 2 вывода на дисплей. Спецификация Wi-Fi — 802.11a/b/g/n. Это довольно высокий уровень в то время. Однако этот Wi-Fi использует чипсет Broadcom (BCM4321), который не очень хорошо поддерживается в Linux, поскольку он

В этой статье мы обсудим использование библиотеки динамической компоновки (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, щелкните правой кнопкой мыши решение в обозревателе решений и выберите «Открыть папку в проводнике»

Во-первых, мы обсудим вопросы и требования, которые следует учитывать при разработке собственных библиотек DLL.

Типы DLL

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

  • динамическое связывание во время загрузки и
  • динамическое связывание во время выполнения.

Динамическое связывание во время загрузки

При динамическом связывании во время загрузки приложение выполняет явные вызовы экспортированных функций DLL, таких как локальные функции. Чтобы использовать динамическую компоновку во время загрузки, предоставьте файл заголовка (.h) и файл библиотеки импорта (.lib) при компиляции и компоновке приложения. Когда вы сделаете это, компоновщик предоставит системе информацию, необходимую для загрузки библиотеки DLL, и разрешения расположения функций экспортированной библиотеки DLL во время загрузки.

Динамическое связывание во время выполнения

При динамическом связывании во время выполнения приложение вызывает либо функцию LoadLibrary, либо функцию LoadLibraryEx для загрузки библиотеки DLL во время выполнения. После успешной загрузки DLL вы используете функцию GetProcAddress, чтобы получить адрес экспортированной функции DLL, которую вы хотите вызвать. При использовании динамической компоновки во время выполнения файл библиотеки импорта не требуется.

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

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

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

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

Точка входа в DLL

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

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

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

Функция точки входа должна выполнять только простые задачи инициализации и не должна вызывать какие-либо другие функции загрузки или завершения DLL. Например, в функции точки входа не следует прямо или косвенно вызывать функцию LoadLibrary или функцию LoadLibraryEx. Кроме того, не следует вызывать функцию FreeLibrary, когда процесс завершается.

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

Экспорт функций DLL

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

Чтобы использовать ключевое слово функции, вы должны объявить каждую функцию, которую хотите экспортировать, с помощью следующего ключевого слова –

Чтобы использовать экспортированные функции DLL в приложении, вы должны объявить каждую функцию, которую вы хотите импортировать, с помощью следующего ключевого слова –

Как правило, вы должны использовать один заголовочный файл с оператором определения и оператором ifdef для разделения оператора экспорта и оператора импорта.

Вы также можете использовать файл определения модуля для объявления экспортируемых функций DLL. Когда вы используете файл определения модуля, вам не нужно добавлять ключевое слово function к экспортируемым функциям DLL. В файле определения модуля вы объявляете инструкцию LIBRARY и инструкцию EXPORTS для DLL. Следующий код является примером файла определения.

Написать образец DLL

В Microsoft Visual C++ 6.0 можно создать библиотеку DLL, выбрав тип проекта Win32 Dynamic-Link Library или тип проекта MFC AppWizard (dll).

Следующий код является примером библиотеки DLL, созданной в Visual C++ с использованием типа проекта Win32 Dynamic-Link Library.

Вызов образца библиотеки DLL

Следующий код является примером проекта приложения Win32, который вызывает экспортированную функцию DLL в библиотеке DLL SampleDLL.

ПРИМЕЧАНИЕ. При динамическом связывании во время загрузки необходимо связать библиотеку импорта SampleDLL.lib, которая создается при сборке проекта SampleDLL.

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

При компиляции и компоновке приложения SampleDLL операционная система Windows ищет DLL-библиотеку SampleDLL в следующих местах в указанном порядке —

Папка приложения

Текущая папка

Системная папка Windows (функция GetSystemDirectory возвращает путь к системной папке Windows).

Папка Windows (функция GetWindowsDirectory возвращает путь к папке Windows).

С помощью 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 для выполнения сложения, вычитания и умножения.

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