- Статья Генерация .lib из DLL с помощью Visual Studio
- Dragokas
- Как исправить ошибки DLL файлов в Windows 10, 8 или 7
- Возможные причины повреждения, удаления или ошибок DLL файлов
- Способы восстановления DLL файлов в Windows 10
- Пошаговое руководство. Создание и использование собственной библиотеки динамической компоновки (C++) Walkthrough: Create and use your own Dynamic Link Library (C++)
- Предварительные требования Prerequisites
- Создание проекта библиотеки DLL Create the DLL project
- Создание проекта библиотеки DLL в Visual Studio 2019 To create a DLL project in Visual Studio 2019
- Создание проекта библиотеки DLL в Visual Studio 2017 To create a DLL project in Visual Studio 2017
- Создание проекта библиотеки DLL в Visual Studio 2015 и более ранних версий To create a DLL project in Visual Studio 2015 and older versions
- Добавление файла заголовка в библиотеку DLL To add a header file to the DLL
- Добавление реализации в библиотеку DLL To add an implementation to the DLL
- Создание клиентского приложения, которое использует библиотеку DLL Create a client app that uses the DLL
- Создание клиентского приложения в Visual Studio To create a client app in Visual Studio
- Создание клиентского приложения в Visual Studio 2017 To create a client app in Visual Studio 2017
- Создание клиентского приложения в Visual Studio 2015 To create a client app in Visual Studio 2015
- Добавление заголовка библиотеки DLL в путь включения To add the DLL header to your include path
- Добавление библиотеки импорта DLL в проект To add the DLL import library to your project
- Копирование библиотеки DLL в событие после сборки To copy the DLL in a post-build event
Статья Генерация .lib из DLL с помощью Visual Studio
Dragokas
Very kind Developer
Программисты часто имеют дело со сторонними DLL, написанными третьими лицами, функции которых нужны при разработке. Это разумно и полезно, поскольку до тех пор, пока интерфейс DLL остается прежним, слинкованные с ней другие DLL-и могут легко заменяться без повторной компиляции и пересборки кода.
Однако, в Visual Studio чтобы прилинковать к коду стороннюю библиотеку, нужно иметь файл .lib, — самой по себе DLL для этой задачи недостаточно. К счастью, существует способ сгенерировать .lib из DLL с помощью Visual Studio. Создание файла .lib напоминает реверс-инжиниринг содержимого DLL.
1. Не обращая внимание на версию вашей Visual Studio, будь то 2003, 2005 или 2008 .NET, откройте командную строку Visual Studio Tools (обычно, что-то вроде Start -> Program Files -> Microsoft Visual Studio -> Visual Studio Tools -> Visual Studio Command Prompt).
2. Если у вас уже есть файл .def для вашей DLL, можете пропустить этот шаг. В противном случае, если ваша DLL не снабжена файлом .def, вам придется немного поработать, как описано ниже. Вы не можете сгенерировать .lib без файла .def, извините. Для генерации файла .def из DLL, выполните команду dumpbin для извлечения имен функций из вашей DLL. В нашем примере мы будем работать с sqlite3.dll.
Вывод можете видеть ниже:
Обведённые красным имена функций — это то, что вас интересует. Аккуратно скопируйте эти имена функций в новый текстовый файл с расширением .def. В начало этого нового файла поместите «EXPORTS» без кавычек, а затем каждую функцию в отдельной строке, как показано ниже:
Как исправить ошибки DLL файлов в Windows 10, 8 или 7
Читайте, как восстановить сбойные DLL библиотеки в Windows 10, 8 или 7 . Какие причины повреждения, удаления или ошибок DLL файлов. Сами по себе DLL файлы не являются исполняемыми файлами, но они используются в работе другими программами. Часто несколько программ или драйверов могут использовать DLL файл совместно, поэтому удаление или обновление одной программы может вывести из строя другие.
Если вы получаете сообщения: «DLL файл не найден или отсутствует» , «не удалось зарегистрировать DLL библиотеку» , «отсутствует необходимый компонент» или «необходима повторная установка приложения» , то наша инструкция будет полезна для вас. Такие сообщения могут возникать во время запуска любого приложения или игры, во время установки, обновления или старта системы Windows 10, 8 или 7.
Для выявления причины ошибки и получения рекомендаций по её устранению можно использовать Журнал событий системы. Особенно полезно это будет если ошибка блокирует загрузку системы или вызывает синий экран смерти (BSOD) .
Если вы не можете запустить систему из-за ошибки в обычном режиме, используйте загрузку в безопасном режиме .
Возможные причины повреждения, удаления или ошибок DLL файлов
- Непреднамеренное удаление DLL файлов по ошибке.
- Перезапись системных DLL файлов устаревшими версиями.
- Заражение вирусами или вредоносным ПО.
- Повреждение жесткого диска.
- Отсутствие или повреждение драйверов оборудования.
- В Windows находятся несовместимые версии файлов, которые принадлежат к различным приложениям.
- Отсутствие необходимых компонентов Windows: DirectX, C++ Runtime Library, .NET Framework.
- Автоматические обновления Windows и драйверов системы.
- Использование устаревших или не правильных драйверов.
- Повреждение или удаление критически важных веток реестра.
Способы восстановления DLL файлов в Windows 10
- Если Windows перестала загружаться, или были повреждены или удалены системные файлы, вы можете воспользоваться инструментами среды восстановления.
- Так же в Windows 10, 8 или 7 присутствует инструмент для автоматического восстановления системных файлов или библиотек из командной строки.
- Ошибки, связанные c отсутствием необходимых библиотек DirectX или C++ Runtime Library являются наиболее часто встречаемыми проблемами в Windows.
Вам необходимо установить совместимую версию DirectX, если игра вылетает с ошибкой: “Запуск программы не возможен, так как на компьютере отсутствует файл DLL. Попробуйте переустановить программу” , или в тексте ошибки указаны следующие библитеки: d3dx9_43.dll, xinput1_3.dll, d3dx9_31.dll, d3dx9_34.dll, xinput1_2.dll, d3d11.dll, d3dx9_35.dll, dxgi.dll, d3dx9_25.dll, d3d11.dll, d3dx9.dll, d3dx9_43.dll, d3dx10_43.dll, d3dx9_26.dll, d3dx9_30.dll, d3dx9_27.dll, d3dx11_43.dll, d3dcompiler_43.dll, d3d10.dll, xinput1_3.dll, d3dx9_31.dll, xinput1_2.dll, d3dx9_31.dll, d3dx9_34.dll, d3dx9_42.dll, x3daudio1_7.dll, x3daudio1_6.dll, xrsound.dll . Для этого необходимо воспользоваться Web инсталлятором DirectX от Microsoft .
Установите необходимую версию C++ Runtime Library, если в тексте ошибки указаны библитеки содержащие слова MSVCR или RUNTIME: MSVCR120.dll, MSVCP120.dll, MSVCR110.dll, MSVCP110.dll, MSVCR100.dll, MSVCP100.dll, MSVCR90.dll, MSVCP90.dll, MSVCR80.dll, MSVCP80.dll, VCRUNTIME140.dll, runtime-x64.dll, runtime-x32.dll, runtime.dll, runtime-110.dll и т.д.
Найдите в системных требованиях к программе какая версия библиотек C++ Runtime Dll необходима для работы и установите нужную:
Переустановите программу, ссылающуюся на DLL файл. Причиной ошибки DLL файла может быть ошибка в работе использующей его программы.
Пошаговое руководство. Создание и использование собственной библиотеки динамической компоновки (C++) Walkthrough: Create and use your own Dynamic Link Library (C++)
В этом пошаговом руководстве показано, как с помощью интегрированной среды разработки (IDE) Visual Studio создать собственную библиотеку динамической компоновки (DLL), написанную на Microsoft C++ (MSVC). This step-by-step walkthrough shows how to use the Visual Studio IDE to create your own dynamic link library (DLL) written in Microsoft C++ (MSVC). Далее в нем показано, как использовать библиотеку DLL из другого приложения C++. Then it shows how to use the DLL from another C++ app. Библиотеки DLL (также называемые общими библиотеками в операционных системах на основе UNIX) являются одним из наиболее полезных компонентов Windows. DLLs (also known as shared libraries in UNIX-based operating systems) are one of the most useful kinds of Windows components. Их можно использовать для обмена кодом и ресурсами, а также для уменьшения размера своих приложений. You can use them as a way to share code and resources, and to shrink the size of your apps. Библиотеки DLL могут упростить обслуживание и расширение приложений. DLLs can even make it easier to service and extend your apps.
В этом пошаговом руководстве вы создадите библиотеку DLL, которая реализует некоторые математические функции. In this walkthrough, you’ll create a DLL that implements some math functions. Затем вы создадите консольное приложение, использующее функции из библиотеки DLL. Then you’ll create a console app that uses the functions from the DLL. Попутно вы познакомитесь с некоторыми методами программирования и соглашениями, используемыми в библиотеках DLL для Windows. You’ll also get an introduction to some of the programming techniques and conventions used in Windows DLLs.
В этом пошаговом руководстве рассматриваются следующие задачи: This walkthrough covers these tasks:
Создание проекта библиотеки DLL в Visual Studio. Create a DLL project in Visual Studio.
Добавление экспортированных функций и переменных в библиотеку DLL. Add exported functions and variables to the DLL.
Создание проекта «Консольное приложение» в Visual Studio. Create a console app project in Visual Studio.
Использование в консольном приложении функций и переменных, импортированных из библиотеки DLL. Use the functions and variables imported from the DLL in the console app.
Запуск готового приложения. Run the completed app.
Как и в случае со статически связанной библиотекой, библиотека DLL экспортирует переменные, функции и ресурсы по имени. Like a statically linked library, a DLL exports variables, functions, and resources by name. Клиентское приложение импортирует имена для использования этих переменных, функций и ресурсов. A client app imports the names to use those variables, functions, and resources. В отличие от статически компонуемой библиотеки, Windows соединяет импорт в вашем приложении с экспортом в библиотеку DLL во время загрузки или выполнения, а не во время компоновки. Unlike a statically linked library, Windows connects the imports in your app to the exports in a DLL at load time or at run time, instead of connecting them at link time. Для выполнения этих подключений Windows требуются дополнительные сведения, которые не являются частью стандартной модели компиляции C++. Windows requires extra information that isn’t part of the standard C++ compilation model to make these connections. Чтобы предоставить эти дополнительные сведения, компилятор MSVC реализует некоторые специальные расширения Майкрософт для C++. The MSVC compiler implements some Microsoft-specific extensions to C++ to provide this extra information. Мы рассмотрим эти расширения далее. We explain these extensions as we go.
В этом пошаговом руководстве создаются два решения Visual Studio. Первое решение создает библиотеку DLL, а второе — клиентское приложение. This walkthrough creates two Visual Studio solutions; one that builds the DLL, and one that builds the client app. Библиотека DLL использует соглашение о вызовах языка C. The DLL uses the C calling convention. Ее можно вызывать из приложений, написанных на других языках программирования, при условии, что платформа, соглашения о вызовах и соглашения о связывании совпадают. It can be called from apps written in other programming languages, as long as the platform, calling conventions, and linking conventions match. Клиентское приложение использует неявную компоновку, в рамках которой Windows связывает приложение с библиотекой DLL во время загрузки. The client app uses implicit linking, where Windows links the app to the DLL at load-time. Эта компоновка позволяет приложению вызывать функции, предоставляемые библиотекой DLL, точно так же, как функции в библиотеке статической компоновки. This linking lets the app call the DLL-supplied functions just like the functions in a statically linked library.
В этом пошаговом руководстве не рассматриваются некоторые общие ситуации. This walkthrough doesn’t cover some common situations. В нем не рассматривается использование библиотеки DLL для C++ другими языками. The code doesn’t show the use of C++ DLLs by other programming languages. Он не показывает, как создавать DLL-библиотеки только для ресурсов или как использовать явную компоновку для загрузки библиотек DLL во время выполнения, а не во время загрузки. It doesn’t show how to create a resource-only DLL, or how to use explicit linking to load DLLs at run-time rather than at load-time. Уверяем вас, все это можно выполнять с помощью MSVC и Visual C++. Rest assured, you can use MSVC and Visual Studio to do all these things.
Ссылки на дополнительные сведения о DLL см. в статье Создание библиотек DLL на C/C++ в Visual Studio. For links to more information about DLLs, see Create C/C++ DLLs in Visual Studio. Дополнительные сведения о явной и неявной компоновке см. в разделе Определение подходящего метода связывания. For more information about implicit linking and explicit linking, see Determine which linking method to use. Дополнительные сведения о создании библиотек DLL C++ для использования с языками, в которых применяются соглашения о компоновках языка C, см. в статье Экспорт функций на языке C++ для использования в исполняемых модулях, исходный код которых написан на языке C. For information about creating C++ DLLs for use with programming languages that use C-language linkage conventions, see Exporting C++ functions for use in C-language executables. Дополнительные сведения о том, как создавать библиотеки DLL для использования с языками .NET, см. в статье Вызов функций библиотек DLL из приложений Visual Basic. For information about how to create DLLs for use with .NET languages, see Calling DLL Functions from Visual Basic Applications.
Предварительные требования Prerequisites
- Компьютер под управлением Microsoft Windows 7 или более поздних версий. A computer that runs Microsoft Windows 7 or later versions. Для обеспечения оптимальной среды разработки рекомендуется использовать Windows 10. We recommend Windows 10 for the best development experience.
Копия Visual Studio. A copy of Visual Studio. Сведения о скачивании и установке Visual Studio см. в этой статье. For information on how to download and install Visual Studio, see Install Visual Studio. Когда вы запускаете установщик, убедитесь, что установлена рабочая нагрузка Разработка классических приложений на C++ . When you run the installer, make sure that the Desktop development with C++ workload is checked. Не беспокойтесь, если вы не установили эту рабочую нагрузку при установке Visual Studio. Don’t worry if you didn’t install this workload when you installed Visual Studio. Вы можете снова запустить установщик и установить ее сейчас. You can run the installer again and install it now.
- Копия Visual Studio. A copy of Visual Studio. Сведения о скачивании и установке Visual Studio 2015 см. в разделе Установка Visual Studio 2015. For information on how to download and install Visual Studio 2015, see Install Visual Studio 2015. Для установки компилятора и средств используйте выборочную установку C++, так как они не установлены по умолчанию. Use a Custom installation to install the C++ compiler and tools, since they’re not installed by default.
Базовые значения об использовании интегрированной среды разработки Visual Studio. An understanding of the basics of using the Visual Studio IDE. Если вы уже использовали классические приложения для Windows, вы, вероятно, справитесь. If you’ve used Windows desktop apps before, you can probably keep up. Общие сведения см. в обзоре возможностей интегрированной среды разработки Visual Studio. For an introduction, see Visual Studio IDE feature tour.
Основные навыки владения языком C++. An understanding of enough of the fundamentals of the C++ language to follow along. Не волнуйтесь, мы не будем делать ничего сложного. Don’t worry, we don’t do anything too complicated.
В данном пошаговом руководстве подразумевается, что вы используете Visual Studio 2017 версии 15.9 или более поздней. This walkthrough assumes you’re using Visual Studio 2017 version 15.9 or later. В некоторых более ранних версиях Visual Studio 2017 имелись дефекты в шаблонах кода или использовались разные диалоговые окна пользовательского интерфейса. Some earlier versions of Visual Studio 2017 had defects in the code templates, or used different user interface dialogs. Чтобы избежать проблем, используйте Visual Studio Installer для обновления Visual Studio 2017 до версии 15.9 или более поздней. To avoid problems, use the Visual Studio Installer to update Visual Studio 2017 to version 15.9 or later.
Создание проекта библиотеки DLL Create the DLL project
Этот набор задач позволяет создать проект для библиотеки DLL, добавить код и выполнить его сборку. In this set of tasks, you create a project for your DLL, add code, and build it. Для начала запустите IDE Visual Studio и выполните вход, если это необходимо. To begin, start the Visual Studio IDE, and sign in if you need to. Инструкции немного отличаются в зависимости от используемой версии Visual Studio. The instructions vary slightly depending on which version of Visual Studio you’re using. Убедитесь, что в элементе управления в верхнем левом углу этой страницы выбрана правильная версия. Make sure you have the correct version selected in the control in the upper left of this page.
Создание проекта библиотеки DLL в Visual Studio 2019 To create a DLL project in Visual Studio 2019
В строке меню выберите Файл > Создать > Проект, чтобы открыть диалоговое окно Создание проекта. On the menu bar, choose File > New > Project to open the Create a New Project dialog box.
В верхней части диалогового окна для параметра Язык установите значение C++ , для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Библиотека. At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Library.
В отфильтрованном списке типов проектов щелкните Библиотека динамической компоновки (DLL) , а затем нажмите кнопку Далее. From the filtered list of project types, select Dynamic-link Library (DLL), and then choose Next.
На странице Настроить новый проект введите MathLibrary в поле Имя проекта. In the Configure your new project page, enter MathLibrary in the Project name box to specify a name for the project. Примите заданные по умолчанию Расположение и Имя решения. Leave the default Location and Solution name values. Для параметра Решение задайте Создать новое решение. Set Solution to Create new solution. Снимите флажок Разместить решение и проект в одном каталоге, если он установлен. Uncheck Place solution and project in the same directory if it’s checked.
Нажмите кнопку Создать, чтобы создать проект. Choose the Create button to create the project.
После создания решения созданный проект вместе с исходными файлами отобразится в окне обозревателя решений в Visual Studio. When the solution is created, you can see the generated project and source files in the Solution Explorer window in Visual Studio.
Создание проекта библиотеки DLL в Visual Studio 2017 To create a DLL project in Visual Studio 2017
В строке меню последовательно выберите пункты Файл > Создать > Проект, чтобы открыть диалоговое окно Новый проект. On the menu bar, choose File > New > Project to open the New Project dialog box.
На панели слева в диалоговом окне Новый проект выберите Установленные > Visual C++ > Классическое приложение для Windows. In the left pane of the New Project dialog box, select Installed > Visual C++ > Windows Desktop. В центральной области выберите Библиотека динамической компоновки (DLL) . In the center pane, select Dynamic-Link Library (DLL). В поле Имя введите MathLibrary. Enter MathLibrary in the Name box to specify a name for the project. Примите заданные по умолчанию Расположение и Имя решения. Leave the default Location and Solution name values. Для параметра Решение задайте Создать новое решение. Set Solution to Create new solution. Установите флажок Создать каталог для решения, если он снят. Check Create directory for solution if it’s unchecked.
Нажмите кнопку ОК, чтобы создать проект. Choose the OK button to create the project.
После создания решения созданный проект вместе с исходными файлами отобразится в окне обозревателя решений в Visual Studio. When the solution is created, you can see the generated project and source files in the Solution Explorer window in Visual Studio.
Создание проекта библиотеки DLL в Visual Studio 2015 и более ранних версий To create a DLL project in Visual Studio 2015 and older versions
В строке меню щелкните Файл > Создать > Проект. On the menu bar, choose File > New > Project.
В левой области диалогового окна Новый проект разверните узлы Установленные > Шаблоны и выберите Visual C++ , а затем в центральной области щелкните Консольное приложение Win32. In the left pane of the New Project dialog box, expand Installed > Templates, and select Visual C++, and then in the center pane, select Win32 Console Application. В поле Имя введите MathLibrary. Enter MathLibrary in the Name edit box to specify a name for the project. Примите заданные по умолчанию Расположение и Имя решения. Leave the default Location and Solution name values. Для параметра Решение задайте Создать новое решение. Set Solution to Create new solution. Установите флажок Создать каталог для решения, если он снят. Check Create directory for solution if it’s unchecked.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Новый проект, и запустите мастер приложений Win32. Choose the OK button to dismiss the New Project dialog and start the Win32 Application Wizard.
Нажмите кнопку Далее. Choose the Next button. На странице Параметры приложения в поле Тип приложения выберите пункт DLL. On the Application Settings page, under Application type, select DLL.
Нажмите кнопку Готово , чтобы создать проект. Choose the Finish button to create the project.
Когда мастер завершит создание решения, вы сможете увидеть созданный проект вместе с исходными файлами в окне обозревателя решений в Visual Studio. When the wizard completes the solution, you can see the generated project and source files in the Solution Explorer window in Visual Studio.
Пока эта библиотека DLL ничего не делает. Right now, this DLL doesn’t do very much. Затем вы создадите файл заголовка для объявления функций, экспортируемых вашей библиотекой DLL, и добавите определения функций в библиотеку DLL, чтобы сделать ее более полезной. Next, you’ll create a header file to declare the functions your DLL exports, and then add the function definitions to the DLL to make it more useful.
Добавление файла заголовка в библиотеку DLL To add a header file to the DLL
Чтобы создать файл заголовка для функций, последовательно щелкните Проект > Добавить новый элемент. To create a header file for your functions, on the menu bar, choose Project > Add New Item.
В диалоговом окне Добавление нового элемента в левой области щелкните Visual C++ . In the Add New Item dialog box, in the left pane, select Visual C++. В центральной области выберите Заголовочный файл (.h) . In the center pane, select Header File (.h). Укажите MathLibrary.h в качестве имени для файла заголовка. Specify MathLibrary.h as the name for the header file.
Нажмите кнопку Добавить, чтобы создать пустой файл заголовка, который отображается в новом окне редактора. Choose the Add button to generate a blank header file, which is displayed in a new editor window.
Замените все содержимое этого файла заголовка следующим кодом: Replace the contents of the header file with this code:
Этот файл заголовка объявляет некоторые функции для создания обобщенной последовательности Фибоначчи, исходя из двух начальных значений. This header file declares some functions to produce a generalized Fibonacci sequence, given two initial values. Вызов fibonacci_init(1, 1) создает знакомую последовательность чисел Фибоначчи. A call to fibonacci_init(1, 1) generates the familiar Fibonacci number sequence.
Обратите внимание на операторы препроцессора в верхней части файла. Notice the preprocessor statements at the top of the file. Шаблон нового проекта для библиотеки DLL добавляет PROJECTNAME_EXPORTS к определенным макросам препроцессора. The new project template for a DLL project adds PROJECTNAME_EXPORTS to the defined preprocessor macros. В этом примере Visual Studio определяет MATHLIBRARY_EXPORTS при сборке проекта библиотеки DLL MathLibrary. In this example, Visual Studio defines MATHLIBRARY_EXPORTS when your MathLibrary DLL project is built.
Когда макрос MATHLIBRARY_EXPORTS определен, макрос MATHLIBRARY_API устанавливает модификатор __declspec(dllexport) в объявлениях функций. When the MATHLIBRARY_EXPORTS macro is defined, the MATHLIBRARY_API macro sets the __declspec(dllexport) modifier on the function declarations. Этот модификатор предписывает компилятору и компоновщику экспортировать функцию или переменную из библиотеки DLL для использования другими приложениями. This modifier tells the compiler and linker to export a function or variable from the DLL for use by other applications. Если MATHLIBRARY_EXPORTS не определен, например, когда файл заголовка включен клиентским приложением, MATHLIBRARY_API применяет модификатор __declspec(dllimport) к объявлениям. When MATHLIBRARY_EXPORTS is undefined, for example, when the header file is included by a client application, MATHLIBRARY_API applies the __declspec(dllimport) modifier to the declarations. Этот модификатор оптимизирует импорт функции или переменной в приложении. This modifier optimizes the import of the function or variable in an application. Дополнительные сведения см. в статье dllexport, dllimport. For more information, see dllexport, dllimport.
Добавление реализации в библиотеку DLL To add an implementation to the DLL
В обозревателе решений щелкните узел Файлы решения правой кнопкой мыши и выберите пункты Добавить > Новый элемент. In Solution Explorer, right-click on the Source Files node and choose Add > New Item. Создайте новый CPP-файл с именем MathLibrary.cpp, аналогично добавлению нового файла заголовка на предыдущем шаге. Create a new .cpp file called MathLibrary.cpp, in the same way that you added a new header file in the previous step.
В окне редактора выберите вкладку MathLibrary.cpp, если она уже открыта. In the editor window, select the tab for MathLibrary.cpp if it’s already open. Если нет, то в обозревателе решений дважды щелкните файл MathLibrary.cpp в папке Исходные файлы проекта MathLibrary. If not, in Solution Explorer, double-click MathLibrary.cpp in the Source Files folder of the MathLibrary project to open it.
В редакторе замените содержимое файла MathLibrary.cpp следующим кодом: In the editor, replace the contents of the MathLibrary.cpp file with the following code:
В окне редактора выберите вкладку MathLibrary.cpp, если она уже открыта. In the editor window, select the tab for MathLibrary.cpp if it’s already open. Если нет, то в обозревателе решений дважды щелкните файл MathLibrary.cpp в папке Исходные файлы проекта MathLibrary. If not, in Solution Explorer, double-click MathLibrary.cpp in the Source Files folder of the MathLibrary project to open it.
В редакторе замените содержимое файла MathLibrary.cpp следующим кодом: In the editor, replace the contents of the MathLibrary.cpp file with the following code:
Чтобы убедиться, что все работает, скомпилируйте библиотеку динамической компоновки. To verify that everything works so far, compile the dynamic link library. Чтобы выполнить компиляцию, последовательно выберите Сборка > Собрать решение. To compile, choose Build > Build Solution on the menu bar. Библиотека DLL и связанные выходные данные компилятора помещаются в папку с именем Debug непосредственно под папкой решения. The DLL and related compiler output are placed in a folder called Debug directly below the solution folder. При создании сборки выпуска выходные данные помещаются в папку с именем Release. If you create a Release build, the output is placed in a folder called Release. Результат должен выглядеть следующим образом. The output should look something like this:
Поздравляем, вы создали библиотеку DLL с помощью Visual Studio! Congratulations, you’ve created a DLL using Visual Studio! Далее вы создадите клиентское приложение, которое использует функции, экспортируемые из библиотеки DLL. Next, you’ll create a client app that uses the functions exported by the DLL.
Создание клиентского приложения, которое использует библиотеку DLL Create a client app that uses the DLL
При создании библиотеки DLL подумайте о том, как клиентские приложения могут его использовать. When you create a DLL, think about how client apps may use it. Чтобы вызвать функции или получить доступ к данным, экспортированным библиотекой DLL, исходный код клиента должен иметь объявления, доступные во время компиляции. To call the functions or access the data exported by a DLL, client source code must have the declarations available at compile time. Во время компоновки компоновщику требуются сведения для разрешения вызовов функций или доступа к данным. At link time, the linker requires information to resolve the function calls or data accesses. Библиотека DLL предоставляет эти сведения в библиотеке импорта — файле, который содержит сведения о поиске функций и данных вместо фактического кода. A DLL supplies this information in an import library, a file that contains information about how to find the functions and data, instead of the actual code. Во время выполнения библиотека DLL должна быть доступна клиенту в месте, которое может найти операционная система. And at run time, the DLL must be available to the client, in a location that the operating system can find.
Независимо от того, является ли он вашим или предоставлен сторонним разработчиком, вашему проекту клиентского приложения требуется несколько фрагментов информации для использования библиотеки DLL. Whether it’s your own or from a third-party, your client app project needs several pieces of information to use a DLL. Ему необходимо найти заголовки, в которых объявляются экспорты библиотеки DLL, библиотеки импорта для компоновщика и сама библиотека DLL. It needs to find the headers that declare the DLL exports, the import libraries for the linker, and the DLL itself. Одним из решений является копирование всех этих файлов в ваш клиентский проект. One solution is to copy all of these files into your client project. Для сторонних библиотек DLL, которые вряд ли изменятся во время разработки вашего клиента, этот метод может быть лучшим способом их использования. For third-party DLLs that are unlikely to change while your client is in development, this method may be the best way to use them. Однако, когда вы также создаете библиотеку DLL, лучше избегать дублирования. However, when you also build the DLL, it’s better to avoid duplication. Если вы делаете локальную копию файлов библиотеки DLL, которые находятся в стадии разработки, вы можете случайно изменить файл заголовка только в одной копии или использовать устаревшую библиотеку. If you make a local copy of DLL files that are under development, you may accidentally change a header file in one copy but not the other, or use an out-of-date library.
Чтобы избежать рассинхронизации, мы рекомендуем вам установить путь включения в своем клиентском проекте, чтобы добавить файлы заголовков библиотеки DLL напрямую из проекта DLL. To avoid out-of-sync code, we recommend you set the include path in your client project to include the DLL header files directly from your DLL project. Кроме того, укажите путь к библиотеке в своем клиентском проекте, чтобы добавить библиотеки импорта DLL из проекта DLL. Also, set the library path in your client project to include the DLL import libraries from the DLL project. Наконец, скопируйте встроенную библиотеку DLL из проекта DLL в выходной каталог своей сборки клиента. And finally, copy the built DLL from the DLL project into your client build output directory. Этот шаг позволяет вашему клиентскому приложению использовать тот же код библиотеки DLL, который вы создали. This step allows your client app to use the same DLL code you build.
Создание клиентского приложения в Visual Studio To create a client app in Visual Studio
В строке меню выберите Файл > Создать > Проект, чтобы открыть диалоговое окно Создание проекта. On the menu bar, choose File > New > Project to open the Create a new project dialog box.
В верхней части диалогового окна для параметра Язык выберите значение C++ , для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Консоль. At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Console.
В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее. From the filtered list of project types, choose Console App then choose Next.
На странице Настроить новый проект введите MathClient в поле Имя проекта. In the Configure your new project page, enter MathClient in the Project name box to specify a name for the project. Примите заданные по умолчанию Расположение и Имя решения. Leave the default Location and Solution name values. Для параметра Решение задайте Создать новое решение. Set Solution to Create new solution. Снимите флажок Разместить решение и проект в одном каталоге, если он установлен. Uncheck Place solution and project in the same directory if it’s checked.
Нажмите кнопку Создать, чтобы создать клиентский проект. Choose the Create button to create the client project.
Создается минимальный проект консольного приложения. A minimal console application project is created for you. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. The name for the main source file is the same as the project name that you entered earlier. В этом примере используется имя MathClient.cpp. In this example, it’s named MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL. You can build it, but it doesn’t use your DLL yet.
Создание клиентского приложения в Visual Studio 2017 To create a client app in Visual Studio 2017
Чтобы создать приложение C++, которое использует созданную вами библиотеку DLL, в строке меню выберите Файл > Создать > Проект. To create a C++ app that uses the DLL that you created, on the menu bar, choose File > New > Project.
В левой области диалогового окна Новый проект выберите Классическое приложение Windows в разделе Установленные > Visual C++ . In the left pane of the New Project dialog, select Windows Desktop under Installed > Visual C++. В центральной области выберите Консольное приложение Windows. In the center pane, select Windows Console Application. В поле ввода Имя укажите имя для проекта MathClient. Specify the name for the project, MathClient, in the Name edit box. Примите заданные по умолчанию Расположение и Имя решения. Leave the default Location and Solution name values. Для параметра Решение задайте Создать новое решение. Set Solution to Create new solution. Установите флажок Создать каталог для решения, если он снят. Check Create directory for solution if it’s unchecked.
«Visual C++» > «Windows Desktop» с выделенным пунктом «Консольное приложение Windows» и MathClient в текстовом поле «Имя».» title=»Присвоение имени клиентскому проекту» data-linktype=»relative-path»>
Visual C plus plus > Windows Desktop selected, Windows Console Application highlighted, and Math Client typed in the Name text box.» title=»Name the client project» data-linktype=»relative-path»>
Нажмите кнопку ОК, чтобы создать проект клиентского приложения. Choose OK to create the client app project.
Создается минимальный проект консольного приложения. A minimal console application project is created for you. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. The name for the main source file is the same as the project name that you entered earlier. В этом примере используется имя MathClient.cpp. In this example, it’s named MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL. You can build it, but it doesn’t use your DLL yet.
Создание клиентского приложения в Visual Studio 2015 To create a client app in Visual Studio 2015
Чтобы создать приложение C++, которое использует созданную вами библиотеку DLL, в строке меню выберите Файл > Создать > Проект. To create a C++ app that uses the DLL that you created, on the menu bar, choose File > New > Project.
В левой области диалогового окна Новый проект щелкните Win32 в разделе Установленные > Шаблоны > Visual C++ . In the left pane of the New Project dialog, select Win32 under Installed > Templates > Visual C++. В центральной области выберите Консольное приложение Win32. In the center pane, select Win32 Console Application. В поле ввода Имя укажите имя для проекта MathClient. Specify the name for the project, MathClient, in the Name edit box. Примите заданные по умолчанию Расположение и Имя решения. Leave the default Location and Solution name values. Для параметра Решение задайте Создать новое решение. Set Solution to Create new solution. Установите флажок Создать каталог для решения, если он снят. Check Create directory for solution if it’s unchecked.
«Шаблоны» > «Visual C++» > «Win32» с выделенным пунктом «Консольное приложение Win32 Visual C++» и MathClient в текстовом поле «Имя».» title=»Присвоение имени клиентскому проекту» data-linktype=»relative-path»>
Templates > Visual C plus plus > Win32 selected, Win32 Console Application Visual C plus plus highlighted, and Math Client typed in the Name text box.» title=»Name the client project» data-linktype=»relative-path»>
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Новый проект, и запустите мастер приложений Win32. Choose the OK button to dismiss the New Project dialog and start the Win32 Application Wizard. На странице Обзор диалогового окна Мастер приложений Win32 нажмите кнопку Далее . On the Overview page of the Win32 Application Wizard dialog box, choose the Next button.
На странице Параметры приложения в поле Тип приложения выберите пункт Консольное приложение, если он еще не выбран. On the Application Settings page, under Application type, select Console application if it isn’t already selected.
Нажмите кнопку Готово , чтобы создать проект. Choose the Finish button to create the project.
После завершения работы мастера создается минимальный проект консольного приложения. When the wizard finishes, a minimal console application project is created for you. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. The name for the main source file is the same as the project name that you entered earlier. В этом примере используется имя MathClient.cpp. In this example, it’s named MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL. You can build it, but it doesn’t use your DLL yet.
Затем, чтобы вызвать функции MathLibrary в исходном коде, ваш проект должен содержать файл MathLibrary.h. Next, to call the MathLibrary functions in your source code, your project must include the MathLibrary.h file. Этот файл заголовка можно скопировать в проект клиентского приложения, а затем добавить его в проект как существующий элемент. You could copy this header file into your client app project, then add it to the project as an existing item. Этот метод подходит для сторонних библиотек. This method can be a good choice for third-party libraries. Однако если вы работаете с кодом для библиотеки DLL и клиента одновременно, файлы заголовков могут оказаться несинхронизированными. Чтобы избежать этой проблемы, задайте путь Дополнительные каталоги включаемых файлов в проекте, чтобы добавить путь к исходному заголовку. However, if you’re working on the code for your DLL and your client at the same time, the header files could get out of sync. To avoid this issue, set the Additional Include Directories path in your project to include the path to the original header.
Добавление заголовка библиотеки DLL в путь включения To add the DLL header to your include path
Щелкните правой кнопкой мыши узел MathClient в обозревателе решений, чтобы открыть диалоговое окно Страницы свойств. Right-click on the MathClient node in Solution Explorer to open the Property Pages dialog.
В раскрывающемся списке Конфигурация выберите пункт Все конфигурации, если он еще не выбран. In the Configuration drop-down box, select All Configurations if it’s not already selected.
В области слева выберите пункт Свойства конфигурации > C/C++ > Общие. In the left pane, select Configuration Properties > C/C++ > General.
На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные каталоги включаемых файлов, а затем щелкните Правка. In the property pane, select the drop-down control next to the Additional Include Directories edit box, and then choose Edit.

Дважды щелкните в верхней панели диалогового окна Дополнительные каталоги включаемых файлов, чтобы включить элемент управления «Поле ввода». Double-click in the top pane of the Additional Include Directories dialog box to enable an edit control. Или щелкните значок папки, чтобы создать новую запись. Or, choose the folder icon to create a new entry.
В элементе управления «Поле ввода» укажите путь к расположению файла заголовка MathLibrary.h. In the edit control, specify the path to the location of the MathLibrary.h header file. Чтобы перейти к нужной папке, можно выбрать элемент управления с многоточием ( . ). You can choose the ellipsis (. ) control to browse to the correct folder.
Можно также ввести относительный путь от исходных файлов клиента к папке, содержащей файлы заголовков библиотеки DLL. You can also enter a relative path from your client source files to the folder that contains the DLL header files. Если вы следовали инструкциям по размещению клиентского проекта в отдельном решении, отличном от библиотеки DLL, относительный путь должен выглядеть следующим образом: If you followed the directions to put your client project in a separate solution from the DLL, the relative path should look like this:
Если библиотеки DLL и клиентские проекты находятся в одном решении, относительный путь может выглядеть следующим образом: If your DLL and client projects are in the same solution, the relative path might look like this:
Если библиотеки DLL и клиентские проекты находятся в других папках, измените относительный путь для соответствия. When the DLL and client projects are in other folders, adjust the relative path to match. Или используйте элемент управления «Многоточие» для поиска папки. Or, use the ellipsis control to browse for the folder.

После ввода пути к файлу заголовка в диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК. After you’ve entered the path to the header file in the Additional Include Directories dialog box, choose the OK button. В диалоговом окне Страницы свойств нажмите кнопку OK, чтобы сохранить изменения. In the Property Pages dialog box, choose the OK button to save your changes.
Теперь можно добавить файл MathLibrary.h и использовать функции, которые он объявляет, в вашем клиентском приложении. You can now include the MathLibrary.h file and use the functions it declares in your client application. Замените содержимое файла MathClient.cpp, используя следующий код: Replace the contents of MathClient.cpp by using this code:
Этот код может быть скомпилирован, но не скомпилирован. This code can be compiled, but not linked. Если вы создаете клиентское приложение, в списке ошибок появится несколько ошибок LNK2019. If you build the client app now, the error list shows several LNK2019 errors. Это связано с тем, что в проекте отсутствуют некоторые сведения: Вы не указали, что проект пока еще зависит от библиотеки MathLibrary.lib. That’s because your project is missing some information: You haven’t specified that your project has a dependency on the MathLibrary.lib library yet. И вы не указали компоновщику, как найти файл MathLibrary.lib. And, you haven’t told the linker how to find the MathLibrary.lib file.
Чтобы устранить эту проблему, можно скопировать файл библиотеки непосредственно в проект клиентского приложения. To fix this issue, you could copy the library file directly into your client app project. Компоновщик сможет найти и использовать его автоматически. The linker would find and use it automatically. Однако если и библиотека, и клиентское приложение находятся в стадии разработки, это может привести к изменениям в одной копии, которые не будут отображаться в другой. However, if both the library and the client app are under development, that might lead to changes in one copy that aren’t shown in the other. Чтобы избежать этой проблемы, можно задать свойство Дополнительные зависимости, чтобы сообщить системе сборки о том, что проект зависит от MathLibrary.lib. To avoid this issue, you can set the Additional Dependencies property to tell the build system that your project depends on MathLibrary.lib. Также можно задать путь Дополнительные каталоги библиотек в проекте, включив в него путь к исходной библиотеке при компоновке. And, you can set an Additional Library Directories path in your project to include the path to the original library when you link.
Добавление библиотеки импорта DLL в проект To add the DLL import library to your project
Щелкните правой кнопкой мыши узел MathClient в обозревателе решений и выберите Свойства, чтобы открыть диалоговое окно Страницы свойств. Right-click on the MathClient node in Solution Explorer and choose Properties to open the Property Pages dialog.
В раскрывающемся списке Конфигурация выберите пункт Все конфигурации, если он еще не выбран. In the Configuration drop-down box, select All Configurations if it’s not already selected. Это гарантирует, что любые изменения свойств применяются к сборкам отладки и выпуска. It ensures that any property changes apply to both Debug and Release builds.
В области слева выберите пункт Свойства конфигурации > Компоновщик > Ввод. In the left pane, select Configuration Properties > Linker > Input. На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные зависимости, а затем щелкните Правка. In the property pane, select the drop-down control next to the Additional Dependencies edit box, and then choose Edit.
В диалоговом окне Дополнительные зависимости добавьте MathLibrary.lib в список в верхнем элементе управления «Поле ввода». In the Additional Dependencies dialog, add MathLibrary.lib to the list in the top edit control.
Нажмите кнопку OK, чтобы вернуться в диалоговое окно Страницы свойств. Choose OK to go back to the Property Pages dialog box.
В области слева выберите пункт Свойства конфигурации > Компоновщик > Общие. In the left pane, select Configuration Properties > Linker > General. На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные каталоги библиотек, а затем щелкните Правка. In the property pane, select the drop-down control next to the Additional Library Directories edit box, and then choose Edit.
Дважды щелкните в верхней панели диалогового окна Дополнительные каталоги библиотек, чтобы включить элемент управления «Поле ввода». Double-click in the top pane of the Additional Library Directories dialog box to enable an edit control. В элементе управления «Поле ввода» укажите путь к расположению файла MathLibrary.lib. In the edit control, specify the path to the location of the MathLibrary.lib file. По умолчанию он находится в папке с именем Debug непосредственно в папке решения DLL. By default, it’s in a folder called Debug directly under the DLL solution folder. При создании сборки выпуска файл помещается в папку с именем Release. If you create a release build, the file is placed in a folder called Release. Можно использовать макрос $(IntDir) , чтобы компоновщик мог найти библиотеку DLL независимо от типа создаваемой сборки. You can use the $(IntDir) macro so that the linker can find your DLL, no matter which kind of build you create. Если вы следовали инструкциям по размещению клиентского проекта в отдельном решении, отличном от проекта DLL, относительный путь должен выглядеть следующим образом: If you followed the directions to put your client project in a separate solution from the DLL project, the relative path should look like this:
Если библиотеки DLL и клиентские проекты находятся в других расположениях, измените относительный путь для соответствия. If your DLL and client projects are in other locations, adjust the relative path to match.
Как только вы ввели путь к файлу библиотеки, в диалоговом окне Дополнительные каталоги библиотек нажмите кнопку ОК, чтобы вернуться в диалоговое окно Страницы свойств. Once you’ve entered the path to the library file in the Additional Library Directories dialog box, choose the OK button to go back to the Property Pages dialog box. Нажмите ОК, чтобы сохранить изменения свойств. Choose OK to save the property changes.
Ваше клиентское приложение теперь можно компилировать и компоновать, но в нем по-прежнему нет всего необходимого для запуска. Your client app can now compile and link successfully, but it still doesn’t have everything it needs to run. Когда операционная система загружает ваше приложение, оно ищет библиотеку DLL MathLibrary. When the operating system loads your app, it looks for the MathLibrary DLL. Если она не может найти библиотеку DLL в определенных системных каталогах, в пути среды или локальном каталоге приложения, загрузка завершается сбоем. If it can’t find the DLL in certain system directories, the environment path, or the local app directory, the load fails. В зависимости от операционной системы вы увидите сообщение об ошибке следующего вида: Depending on the operating system, you’ll see an error message like this:
Чтобы избежать этой проблемы, можно скопировать библиотеку DLL в каталог, в котором находится исполняемый файл клиента, в процессе сборки. One way to avoid this issue is to copy the DLL to the directory that contains your client executable as part of the build process. Можно добавить событие после сборки в ваш проект, чтобы добавить команду, которая копирует библиотеку DLL в выходной каталог вашей сборки. You can add a Post-Build Event to your project, to add a command that copies the DLL to your build output directory. Указанная здесь команда копирует библиотеку DLL только в том случае, если она отсутствует или была изменена. The command specified here copies the DLL only if it’s missing or has changed. Он использует макросы для копирования в расположения отладки или выпуска на основе конфигурации сборки. It uses macros to copy to and from the Debug or Release locations, based on your build configuration.
Копирование библиотеки DLL в событие после сборки To copy the DLL in a post-build event
Щелкните правой кнопкой мыши узел MathClient в обозревателе решений и выберите Свойства, чтобы открыть диалоговое окно Страницы свойств. Right-click on the MathClient node in Solution Explorer and choose Properties to open the Property Pages dialog.
В раскрывающемся списке Конфигурация выберите пункт Все конфигурации, если он еще не выбран. In the Configuration drop-down box, select All Configurations if it isn’t already selected.
В области слева выберите Свойства конфигурации > События сборки > Событие после сборки. In the left pane, select Configuration Properties > Build Events > Post-Build Event.
В области свойств щелкните элемент управления «Поле ввода» в поле Командная строка. In the property pane, select the edit control in the Command Line field. Если вы следовали инструкциям по размещению клиентского проекта в отдельном решении, отличном от проекта DLL, введите следующую команду: If you followed the directions to put your client project in a separate solution from the DLL project, then enter this command:
xcopy /y /d «..\..\MathLibrary\$(IntDir)MathLibrary.dll» «$(OutDir)»
Если библиотеки DLL и клиентские проекты находятся в других каталогах, измените относительный путь к библиотеке DLL для соответствия. If your DLL and client projects are in other directories, change the relative path to the DLL to match.
Нажмите кнопку OK, чтобы сохранить изменения в свойствах проекта. Choose the OK button to save your changes to the project properties.
Теперь в вашем клиентском приложении есть все, что нужно для сборки и запуска. Now your client app has everything it needs to build and run. Соберите приложение, щелкнув команду Сборка > Собрать решение в меню. Build the application by choosing Build > Build Solution on the menu bar. Окно Вывод в Visual Studio должно иметь примерно следующий вид в зависимости от используемой версии Visual Studio: The Output window in Visual Studio should have something like the following example depending on your version of Visual Studio:
Поздравляем, вы создали приложение, которое вызывает функции в вашей библиотеке DLL. Congratulations, you’ve created an application that calls functions in your DLL. Теперь запустите свое приложение, чтобы увидеть, как оно работает. Now run your application to see what it does. В строке меню щелкните Отладка > Начать без отладки. On the menu bar, choose Debug > Start Without Debugging. В Visual Studio открывается командное окно для запуска программы. Visual Studio opens a command window for the program to run in. Последняя часть выходных данных должна выглядеть так: The last part of the output should look like:
Для закрытия командного окна нажмите любую клавишу. Press any key to dismiss the command window.
Теперь, когда вы создали библиотеку DLL и клиентское приложение, вы можете экспериментировать. Now that you’ve created a DLL and a client application, you can experiment. Попробуйте задать точки останова в коде клиентского приложения и запустите приложение в отладчике. Try setting breakpoints in the code of the client app, and run the app in the debugger. Посмотрите, что происходит, когда вы входите в вызов библиотеки. See what happens when you step into a library call. Добавьте другие функции в библиотеку или напишите другое клиентское приложение, которое использует вашу библиотеку DLL. Add other functions to the library, or write another client app that uses your DLL.
При развертывании приложения необходимо также развернуть используемые им библиотеки DLL. When you deploy your app, you must also deploy the DLLs it uses. Самый простой способ сделать библиотеки DLL, которые вы создаете или добавляете из сторонних источников, доступными — поместить их в тот же каталог, что и ваше приложение. The simplest way to make the DLLs that you build, or that you include from third parties, available is to put them in the same directory as your app. Это также называется локальным развертыванием приложений. It’s known as app-local deployment. Дополнительные сведения о развертывании см. в разделе Deployment in Visual C++. For more information about deployment, see Deployment in Visual C++.