Как добавить библиотеку в visual studio
Перейти к содержимому

Как добавить библиотеку в visual studio

  • автор:

Как подключить dll библиотеку в visual studio (c++)?

Если кратко, то dll можно подключить двумя способами:

В первом случае для подключения необходимы: файл заголовка (.h), библиотека импорта (.lib), сама библиотека dll(*.dll). Файл заголовка через #include подключаем туда, где собираемся использовать библиотеку, компоновщику указываем на библиотеку импорта (применительно к vs в свойствах проекта компоновщик->ввод->дополнительные зависимости) и указываем, где искать саму dll (через переменную PATH или в свойствах проекта, например отладка->окружение).

Во втором случае с помощью функции LoadLibrary подгружаем dll, получаем указатель на интересующий объект с помощью функции GetProcAddress, используем.

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); . HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer DWORD dwParam1; UINT uParam2, uReturnVal; hDLL = LoadLibrary("MyDLL"); if (hDLL != NULL) < lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1"); if (!lpfnDllFunc1) < // handle the error FreeLibrary(hDLL); return SOME_ERROR_CODE; >else < // call the function uReturnVal = lpfnDllFunc1(dwParam1, uParam2); >> 

Как добавить библиотеку в visual studio

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

Создадим и подключим библиотеку классов.

Возьмем имеющийся проект консольного приложения C#, например, созданный в прошлых темах. В структуре проекта нажмем правой кнопкой на название решения и далее в появившемся контекстном меню выберем Add -> New Project. (Добавить новый проект):

Создание библиотеки классов в C#

Далее в списке шаблонов проекта найдем пункт Class Library :

Библиотека классов в C# и .NET

Затем дадим новому проекту какое-нибудь название, например, MyLib:

Class Library in .NET

После создания этого проекта в решение будет добавлен новый проект, в моем случае с названием MyLib:

Добавление нового проекта в C# и .NET

По умолчанию новый проект имеет один пустой класс Class1 в файле Class1.cs. Мы можем этот файл удалить или переименовать, как нам больше нравится.

Например, переименуем файл Class1.cs в Person.cs, а класс Class1 в Person. Определим в классе Person простейший код:

namespace MyLib < public class Person < string name; public Person(string name) < this.name = name; >public void Print() => Console.WriteLine($"Name: "); > >

Новый проект в C# и .NET Core

Теперь скомпилируем библиотеку классов. Для этого нажмем правой кнопкой на проект библиотеки классов и в контекстном меню выберем пункт Rebuild :

Компиляция библиотеки классов в C# и .NET Core

После компиляции библиотеки классов в папке проекта в каталоге bin/Debug/net6.0 мы сможем найти скомпилированный файл dll (MyLib.dll). Подключим его в основной проект. Для этого в основном проекте нажмем правой кнопкой на узел Dependencies и в контекстном меню выберем пункт Add Project Reference. :

Добавление библиотеки классов в проекте на C# и .NET Core

Далее нам откроется окно для добавления библиотек. В этом окне выберем пункт Solution,который позволяет увидеть все библиотеки классов из проектов текущего решения, поставим отметку рядом с нашей библиотекой и нажмем на кнопку OK:

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

После успешного подключения библиотеки в главном проекте изменим файл Program.cs , чтобы он использовал класс Person из библиотеки классов:

using MyLib; // подключение пространства имен из библиотеки классов Person tom = new("Tom"); tom.Print(); // Name: Tom

Как добавить библиотеку в visual studio

Краткая инструкция по установке всех нужных для курса библиотек для Visual Studio

На Windows рекомендуется использовать

  • Visual Studio Community Edition последней версии для разработки
  • vcpkg для установки пакетов
  • CMake для сборки некоторых библиотек

Без vcpkg каждую библиотеку придётся ставить по отдельности. Пакетный менеджер vcpkg автоматизирует скачивание и сборку библиотек на машине разработчика.

Установка CMake

Для сборки примеров потребуется CMake. Свои работы можно делать без CMake.

  • Скачайте Cmake с официального сайта
  • При установке не забудьте поменять опцию, чтобы путь к CMake был добавлен в переменную PATH

Скриншот

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

Установка и использование vcpkg

Пакетный менеджер vcpkg распространяется в исходниках и собирается на машине разработчика. Для сборки потребуется установленная Visual Studio с инструментами C++ разработчика.

Порядок установки описан в консольных командах:

:: Клонируем репозиторий vcpkg (ветка master) git clone https://github.com/Microsoft/vcpkg :: Переходим в каталог клона репозитория cd vcpkg :: Выполняем скрипт для сборки vcpkg powershell -exec bypass scripts\bootstrap.ps1 :: Теперь в корне репозитория лежит vcpkg.exe, который можно вызывать :: из каталога либо добавить в переменную окружения PATH. :: Установка библиотеки выполняется командой install vcpkg install sdl2:x86-windows-static sdl2:x64-windows-static 

Из команды выше легко понять, что имена пакетов перечисляются по порядку, а в качестве суффикса используется так называемый “триплет”: имя_пакета:триплет .

  • Имя пакета задаёт одно из множества имён доступных библиотек.
  • Триплет задаёт архитектуру и режим сборки
arm-uwp.cmake x64-uwp.cmake x64-windows-static.cmake x64-windows.cmake x86-uwp.cmake x86-windows-static.cmake x86-windows.cmake 

Для данного курса рекомендуются триплеты x86-windows-static для сборки 32-битной версии программы и x64-windows-static для сборки 64-битной версии. Суффикс static означает, что библиотеки будут собираться статически и вам не потребуется распространять DLL.

Вместо явного указания триплета для каждой библиотеки можно разом указать триплет для всех:

vcpkg --triplet x86-windows-static sdl2 sdl2-image 

Последняя, но крайне важная деталь: включите автоматическую интеграцию пакетов vcpkg во все проекты Visual C++:

:: Включаем интеграцию во все проекты Visual C++ в системе. :: При первом запуске нужны права администратора. vcpkg integrate install :: Удаляем интеграцию - если она вам помешала. vcpkg integrate remove 

Установка пакетов для курса

Мы используем следующие библиотеки:

  • sdl2, sdl2-image, sdl2-mixer, sdl2-ttf в целях абстрагирования от операционной системы для создания окон, растеризации текстовых надписей, загрузки изображений с диска, загрузки и проигрывания звуковых файлов
  • glbinding для прозрачного подключения нужной версии API OpenGL без необходимости вручную работать с механизмом расширений OpenGL
  • assimp3 для загрузки 3D моделей из множества форматов файлов
  • anax для построения архитектуры программы на принципах Component-Entity-System
  • bullet3 для расчёта столкновений в 3D пространстве
  • glm для работы с линейной алгеброй в рамках задач 3D графики
  • nlohmann-json для загрузки JSON
  • tinyxml2 для загрузки XML

Команда для установки 32-битных версий библиотек из исходников может выполняться долго, т.к. сборка занимает длительное время:

vcpkg --triplet x86-windows-static sdl2 sdl2-image sdl2-mixer sdl2-ttf glbinding assimp anax bullet3 glm nlohmann-json tinyxml2 

Настройка gitignore для своих проектов

В Visual Studio управление настройками сборки производится в графическом режиме в окне настроек проекта, хотя сами настройки сохраняются в XML определённой схемы в файле *.vcxproj . Виртуальные папки (фильтры), по которым разложены файлы проекта, сохраняются в файле *.vcxproj.filters . Настройки проекта из раздела Debugging, а также некоторые неявные пользовательские настройки сохраняются в *.vcxproj.user . Есть общепринятые правила:

  • Файлы *.vcxproj необходимы и достаточны для сборки проекта, их следует держать под контролем версий Git, а настройки проекта изменять аккуратно
  • Файлы *.vcxproj.filters не нужны для сборки, но хранят фильтры файлов, их тоже следует держать под контролем версий Git
  • Файлы *.vcxproj.user хранят специфичные для компьютера настройки, их не следует держать в Git
  • Файлы *.sln хранят списки проектов и информацию о сборке всего списка проектов в разных конфигурациях. Их следует держать в Git.

Вы можете взять готовый шаблон файла .gitignore из репозитория github.com/github/gitignore. После добавления файла .gitignore в корень своего репозитория достаточно сделать commit, добавляющий этот файл.

PS-Group

  • PS-Group
  • sshambir@gmail.com
  • ps-group
  • image/svg+xml sshambir

Как добавить библиотеку в visual studio

Рассмотрен по шагам процесс создания в Visual Studio файла динамически загружаемой библиотеки *.dll и методы вызова функций из неё. Все описанное далее делается на примере среды разработки Visual Studio 2003 Version 7.1.3088, но также подходит и к Visual Studio 2005. Для простоты папки создаваемых проектов будут находиться в директории C:\VSPROJ\.

[Создание библиотеки DLL]

1. File -> New -> Project, в дереве Project Types: выбираем Visual C++ Projects -> Win32, в окошке Templates: выбираем Win32 Console Project. В поле Name: вводим имя проекта для DLL, например MyDLL, в поле ввода Location: выбираем путь C:\VSPROJ (можно воспользоваться кнопкой Browse. ). Жмем ОК.

DLL-VisualStudio01.PNG

2. Появится окошко мастера настройки свойств проекта Win32 Application Wizard — MyDLL. Щелкаем на Application Settings, Application type: выбираем DLL, в Additional options: ставим галочку Empty project, жмем Finish.

DLL-VisualStudio02.PNG

3. Создадим заголовочный файл для модуля наших функций в создаваемой DLL. В дереве браузера проекта выбираем Header Files -> Add -> Add New Item. в дереве Categories: выбираем Visual C++ -> Code, в шаблонах Templates: выбираем Header File (.h). В поле Name: вводим любое имя файла, например mydllmodule, жмем Open.

DLL-VisualStudio03.PNG

Создастся новый файл, к котором предстоит ввести декларацию класса и методов функций, которые мы хотим добавить в файл DLL. Создадим класс DummyClass, и в нем две функции Beep и Msg. Одна будет выдавать короткий звуковой сигнал, вторая будет выводить окошко с сообщением. Вводим следующий текст:

namespace dllfuncs
class DummyClass
public :
// Делаем бип
static __declspec(dllexport) void ShortBeep ( void );

// Выводим окошко с сообщением
static __declspec(dllexport) void Msg ( char * msgstr);
>;
>

Вариант без использования классов:

__declspec(dllexport) void ShortBeep ( void );
__declspec(dllexport) void Msg ( char * msgstr);

4. Создадим файл для модуля наших функций в создаваемой DLL, в котором будет сам код функций. В дереве браузера проекта выбираем Source Files -> Add -> Add New Item. в дереве Categories: выбираем Visual C++ -> Code, в шаблонах Templates: выбираем C++ File (.cpp). В поле Name: вводим то же самое имя файла, которое вводили на шаге 3 — mydllmodule, жмем Open.

DLL-VisualStudio04.PNG

Создастся новый файл, к котором будет код функций, добавляемых в файл DLL. Вводим в него следующий текст:

#include «Windows.h»
#include «mydllmodule.h»

using namespace std;

namespace dllfuncs
void DummyClass::ShortBeep( void )
Beep(1000,100); //частота 1000 Гц, длительность 100 мс
>

void DummyClass::Msg( char * msgstr)
MessageBox(NULL, msgstr, «Message from DLL» , MB_OK);
>
>

Вариант без использования классов:

#include «Windows.h»
#include
#include «mydllmodule.h»

using namespace std;

void ShortBeep( void )
Beep(1000,100); //частота 1000 Гц, длительность 100 мс
>

void Msg( char * msgstr)
MessageBox(NULL, msgstr, «Message from DLL» , MB_OK);
>

После всех этих действий появится папка C:\VSPROJ\MyDLL\, в которой будут находиться файлы mydllmodule.cpp и mydllmodule.h, а также конфигурационные файлы проекта MyDLL.

5. Чтобы наш проект скомпилировался в DLL, это должно быть настроено в свойствах проекта. Проверим настройки: MyDLL -> Properties. -> Configuration Properties -> General -> Configuration Type должно быть установлено в Dynamic Library (.dll). Жмем OK.

DLL-VisualStudio05.PNG

6. Теперь скомпилируем нашу библиотеку Build -> Build MyDLL. В папке C:\VSPROJ\MyDLL\Debug появятся два файла MyDLL.dll и MyDLL.lib. Первый файл MyDLL.dll — динамически загружаемая библиотека наших функций, она должна находится в папке исполняемого файла, который использует эти функции (см. [Создание приложения, которое использует функции из DLL]). Второй файл MyDLL.lib — статическая библиотека, которая может быть присоединена на этапе компиляции к приложению, использующему функции проекта MyDLL (см. [Создание приложения, которое использует функции из статической библиотеки lib]).

[Создание приложения, которое использует функции из загружаемой DLL]

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

1. File -> New -> Project, в дереве Project Types: выбираем Visual C++ Projects -> Win32, в окошке Templates: выбираем Win32 Console Project. В поле Name: вводим имя проекта для приложения, использующего загрузку DLL, например DLLtest, в поле ввода Location: выбираем путь C:\VSPROJ (можно воспользоваться кнопкой Browse. ). Также выберем радиокнопку Add to Solution, это просто добавит в нашу группу проектов (в котором уже есть проект MyDLL) новый проект DLLtest. Жмем ОК.

DLL-VisualStudio06.PNG

2. Настроим свойства тестового приложения. Выберите тип приложения Console application и нажмите Finish.

DLL-VisualStudio07.PNG

После этого автоматически создастся папка C:\VSPROJ\DLLtest\, в ней появится файл DLLtest.cpp, и туда введется пустой код тела функции _tmain. В функцию _tmain мы впоследствии добавим вызовы функций из модуля MyDLL.

3. Нужно настроить в проекте DLLtest ссылки на загружаемую DLL. Щелкаем правой кнопкой на папку DLLtest в дереве Solution Explorer — DLLtest, выберем Add Reference. откроется окно выбора внешних ссылок на загружаемые библиотеки. На закладке Projects выберите MyDLL c:\Vsproj\MyDLL\ и нажмите кнопку Select, а затем OK. В проекте DLLtest в дереве проекта появится папка References и подпапка MyDLL, в которой с помощью Object Browser можно просмотреть функции из нашей библиотеки MyDLL.

DLL-VisualStudio08.PNG

DLL-VisualStudio09.PNG

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

4. Вставим в приложение вызовы функций Msg и ShortBeep, для этого добавим в модуль DLLtest.cpp включаемый заголовок mydllmodule.h, и установим добавочные пути поиска файлов заголовков проекта DLLtest. Жмем правую кнопку на DLLtest -> выбираем Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories -> $(ProjectDir)\..\MyDLL и жмем OK.

DLL-VisualStudio10.PNG

Добавим в модуль DLLtest.cpp вызовы функций ShortBeep и Msg, код модуля DLLtest.cpp получится следующий:

// DLLtest.cpp : здесь определена точка входа для консольного приложения.
//

#include «stdafx.h»
#include «mydllmodule.h»

using namespace std;

int _tmain( int argc, _TCHAR* argv[])

dllfuncs::DummyClass::ShortBeep();
dllfuncs::DummyClass::Msg( «Hello, world!» );
return 0;
>

Вариант без использования классов:

// DLLtest.cpp : Defines the entry point for the console application.
//

#include «stdafx.h»
#include «mydllmodule.h»

using namespace std;

int _tmain( int argc, _TCHAR* argv[])
ShortBeep();
Msg( «Hello, world!» );
return 0;
>

5. Осталось скомпилировать наше приложение (Build -> Build Solution или правой кнопкой на папку DLLtest, выбираем Build), переписать скомпилированную C:\VSPROJ\MyDLL\Debug\MyDLL.dll в папку C:\VSPROJ\DLLtest\ (иначе при старте DLLtest.exe будет выдаваться сообщение, что не найден файл библиотеки MyDLL.dll), и запустить приложение DLLtest на выполнение. Щелкаем правой кнопкой в Solution Explorer на DLLtest, выбираем в контекстном меню Set as StartUp Project. Затем выбираем Debug -> Start. Прозвучит короткий звуковой сигнал и появится окно с сообщением «Hello, world!». Отлично — наша DLL загружается и работает!

DLL-VisualStudio11.PNG

[Пути поиска библиотек DLL при запуске приложения]

При запуске приложения Windows выполняет поиск библиотек DLL в следующей последовательности:

1. Каталог, в котором находится исполняемый модуль текущего процесса.
2. Текущий каталог.
3. Системный каталог Windows (обычно это папка System32). Путь к этому каталогу извлекается с помощью функции GetSystemDirectory.
4. Каталог Windows. Путь к этому каталогу извлекается с помощью функции GetWindowsDirectory.
5. Каталоги, указанные в переменной среды PATH.

Примечание: переменная среды LIBPATH не используется.

[Ошибки в проектах с DLL]

1. fatal error LNK1104: cannot open file ‘путь_до_папки_проекта_DLL\Debug\имя_файла_библиотеки.lib’, например:

DLLtest fatal error LNK1104: cannot open file ‘\Vsproj\MyDLL\Debug\MyDLL.lib’

Такая ошибка произошла потому, что в модуле кода DLL (в нашем примере это mydllmodule.cpp) забыли подключить заголовок mydllmodule.h (по сообщению об ошибке догадаться невозможно, в чем проблема). Именно в этом заголовке используются атрибуты функций DLL (__declspec(dllexport)). Исправление ошибки: в нашем примере добавить в файл mydllmodule.cpp строчку #include «mydllmodule.h».

2. Не удалось найти компонент — «Приложению не удалось запуститься, поскольку < имя.dll >не был найден. Повторная установка приложения может исправить эту проблему.»

DLL-VisualStudio12.PNG

Проблема решается, если положить в путь поиска нужную DLL (для нашего примера файл MyDLL.dll нужно положить в папку C:\VSPROJ\DLLtest\). Самое лучшее решение — настроить команду в Post-Build Event, которая будет автоматически выполнить копирование DLL в папку отладки программы, которая использует эту DLL. Настраивается Post-Build Event просто, процесс по шагам, на нашем примере проектов MyDLL и DLLtest (предполагается, что обе папки проектов находятся на одном уровне в файловой системе, и входят в один Solution среды разработки Visual Studio, см. [3]):

1. Сначала нужно настроить порядок компиляции проектов в Solution. DLL должна компилироваться первой. Порядок компиляции настраивается через свойства Solution, контекстное меню Project Build Order.

DLL-VisualStudio13.PNG

Порядок проектов в списке можно поменять с помощью закладки Dependencies, которая определяет, какой проект от какого зависит. Первым в списке в нашем примере должен быть проект MyDLL.

2. Теперь осталось в проекте MyDLL настроить Post Build Event, копирующее результат компиляции — файл MyDLL.dll в папку Debug проекта DLLtest. Щелкаем правой кнопкой в Solution Explorer на проекте MyDLL, выбираем Properties -> Configuration Properties -> Build Events -> Post-Build Event -> вставляем в поле Command Line строку cmd /C copy /Y $(TargetPath) $(ProjectDir)\..\DLLtest\Debug\$(TargetFileName).

DLL-VisualStudio14.PNG

[Как отлаживать код DLL в Visual Studio]

В IDE есть приятная возможность отладки DLL по тексту исходного кода, однако это настраивается не слишком очевидно. Процесс по шагам (на нашем примере проектов MyDLL и DLLtest).

1. Сначала нужно задать при отладке стартовым приложением в Solution проект с DLL.

2. Нужно убедиться, что оба проекта MyDLL и DLLtest скомпилированы в конфигурации для отладки Debug.

3. Нужно настроить в свойствах проекта MyDLL запуск внешнего приложения, вызывающего нашу DLL. Щелкаем правой кнопкой в Solution Explorer на проекте MyDLL, выбираем Properties -> Configuration Properties -> Debugging -> в поле Command вводим строку $(ProjectDir)\..\DLLtest\Debug\DLLtest.exe.

Теперь можно ставить точки останова в исходном коде DLL, и отлаживать его, как обычный код. Если у Вас не работает отладка по коду DLL, то возможно, что-то не так с символами отладки (отладочной информацией). Если отладочная информация по коду DLL недоступна, то точки останова в DLL будут в виде коричневых кружков со знаками вопроса. Разобраться с проблемой загрузки символов может помочь просмотр модулей Debug -> Windows -> Modules. На скриншоте показана как раз такая проблема с отладкой.

DLL-VisualStudio15.PNG

Напротив модуля MyDLL.dll в столбце Information стоит No Symbols Loaded, что означает, что отладочная информация по коду DLL недоступна или ошибочна. Решить проблему может помочь полная рекомпиляции обоих проектов MyDLL и DLLtest, входящих в Solution. Выбираем в меню Build -> Rebuild Solution, выбираем Debug -> Start, и теперь отладка по исходному коду DLL работает.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *