Создание и использование статических и динамических библиотек с Visual Studio 2019

После добавления #include <WinSock2.h> в файл cpp ошибка компиляции показывает, что cin, cout, endl и некоторые переменные, определенные вами, отображают неопознанные идентификаторы, а также следующие ошибки
1> C: \ Program Files (x86) \ Windows Kits \ 10 \ Include \ 10.0.17763.0 \ um \ WinSock2.h (2606,1): ошибка C2375: "WSAAsyncGetHostByName": переопределение; другая ссылка, неизвестная причина
Добавление #include <WinSock2.h> предназначено для реализации функции связи через сокеты, но компиляция не удалась.
Решение: Поместите коммуникационную функцию сокета в статическую или динамическую библиотеку.
Примечание: не пишите #include <WinSock2.h>, #include <WinSock2.h в заголовочный файл статической библиотеки (предполагая, что это статический library.h) > Запишите его в исходный файл статической библиотеки (предполагается, что static library.cpp), иначе он сообщит об этой же ошибке, потому что вы пишете #include "header.h" в исходной программе (предполагается, что source.app), что эквивалентно #Include <> в статической библиотеке .h написано здесь.

Ниже приводится введение и использование статических и динамических библиотек.

1. Разница между статическими и динамическими библиотеками

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

2. Использование статических библиотек (Visual Studio 2019)

1. Откройте Visual Studio 2019, выберите создание нового проекта.
Вставьте описание изображения здесь2. Выберите статическую библиотеку, следующий шаг. Затем назовите свой проект и создайте его.
Вставьте описание изображения здесь3. Написание статического кода библиотеки. Таким образом, создайте статическую библиотеку, Visual Studio 2019 поможет вам создать два заголовочных файла framework.h и pch.h и два исходных файла pch.cpp и StaticLib1.cpp (названных в соответствии с именем вашего проекта), напишите свой код в Соответствующее место будет делать.
Примечание. Напишите объявление функции в файле заголовка, например, здесь pch.h. Таким образом, вы можете включить объявление функции с помощью #include "... / pch.h" (абсолютный или относительный путь) в исходный файл статической библиотеки, которая будет использоваться. В противном случае компилятор не сможет распознать функцию, которую вы написали в статической библиотеке
Вставьте описание изображения здесь4. Генерация статической библиотеки. После написания кода щелкните правой кнопкой мыши проект-сгенерировать, компилятор создаст папку отладки в каталоге проекта, который содержит следующие файлы.
Вставьте описание изображения здесь** 5. Использование статических библиотек. ** Создайте новый проект, скажем, консольную программу. Сначала добавьте заголовочный файл статической библиотеки через #include (запишите путь). Затем щелкните правой кнопкой мыши Project-Properties-Configuration Properties-Linker-General-Additional Library Directory. Добавьте каталог, в котором находится ваш lib-файл, относительный или абсолютный. Затем через комментарий #pragma (lib, « ваша статическая библиотека name.lib»), добавьте статическую библиотеку, вы можете использовать функции статической библиотеки.

3. Использование динамических библиотек

1. Создайте динамический библиотечный проект. Выберите Dynamic Link Library (DLL).
Вставьте описание изображения здесь2. Вход в приложение DLL.
Вставьте описание изображения здесьВ проекте, созданном для вас компилятором, есть файл dllmain.cpp, который определяет запись приложения DLL, как показано на рисунке.
APIENTRY определяется как __stdcall, что означает, что эта функция вызывается стандартным способом Pascal, который является методом WINAPI;
параметр функции hModule - каждый модуль DLL в процессе, идентифицируется глобально уникальным 32-байтовым дескриптором HINSTANCE (дескриптор представляет Начальный адрес модуля DLL в виртуальном пространстве процесса действителен только внутри определенного процесса),
параметр ul_reason_for_call указывает причину вызова. Существует четыре типа, а именно PROCESS_ATTACH, PROCESS_DETACH, THREAD_ATTACH и THREAD_DETACH, перечисленные в качестве оператора переключения,
lpReserved представляет зарезервированный параметр, который редко используется в настоящее время.

Чтобы вызвать функцию в Dll, программа должна сначала сопоставить файл DLL с адресным пространством процесса. Чтобы сопоставить файл DLL с адресным пространством процесса, есть два метода: статически связанный и динамически связанный LoadLibrary или LoadLibraryEx.
Когда файл DLL отображается в адресное пространство процесса, система вызывает функцию DLL DllMain, и переданный параметр ul_reason_for_call - DLL_PROCESS_ATTACH.
Другие вызывающие методы будут передавать различные параметры ul_reason_for_call. Например: когда DLL не сопоставлена ​​с адресным пространством процесса, система вызывает ее DllMain, и переданное значение ul_reason_for_call равно DLL_PROCESS_DETACH. Запускается один поток, и функция DllMain библиотеки DLL вызывается со значением DLL_THREAD_ATTACH. Один поток завершается, используйте DLL_THREAD_DETACH для вызова функции DllMain.
3. Написание динамического библиотечного кода.
Напишите простую функцию function () в динамической библиотеке. Эта функция определена в заголовочном файле, и исходный файл реализует функцию. Щелкните правой кнопкой мыши свойства проекта и создайте. Компилятор создает папку отладки в каталоге проекта, который содержит файлы DLL.
Вставьте описание изображения здесь
Вставьте описание изображения здесь4. Использование библиотеки динамических ссылок (неявный вызов)
сначала представляет инструмент Dependency Walker. Это очень полезный инструмент анализа зависимостей модуля PE, предоставляемый в Microsoft Visual C ++. Основные функции:
просмотр модуля импорта модуля PE.
Просмотрите функции импорта и экспорта модуля PE.
Динамический анализ модульных зависимостей модулей PE.
Разрешите имя функции C ++.
То есть вы можете анализировать dll, используемые программой, и просматривать функции в программе или dll.
Откройте файл dll, который вы создали с помощью Dependency Walker, и обнаружите, что функции нет, потому что функция не экспортируется.
Вставьте описание изображения здесьОбъявите экспортируемую функцию с помощью __declspec (dllexport). Восстанови это. Вы можете видеть, что генерируются файл lib и файл exp.
Вставьте описание изображения здесьВставьте описание изображения здесь
Снова откройте файл dll, который вы создали с помощью Dependency Walker. В нем вы найдете функцию, которую вы экспортировали. Конечно, компилятор переименовал ее. (Это вызвано разным синтаксисом языка C и C ++. Метод отсутствия изменения имени функции представлен ниже, поскольку имя функции используется для вызова функции, что неудобно.)
Вставьте описание изображения здесьОбъявите импорт в файле приложения программы, которой необходимо использовать библиотеку динамических ссылок Функции (то есть некоторые или все функции, экспортируемые библиотекой динамической компоновки).
Сначала включите файл заголовка библиотеки динамических ссылок в файл приложения. #include "… / Dll1 / pch.h"
Вставьте описание изображения здесь
объявляет функции импорта и экспорта с помощью инструкций условной компиляции. Изменить файл заголовка DLL.
Вставьте описание изображения здесь
Щелкните правой кнопкой мыши на dll project properties-C / C + ± определение препроцессора-препроцессора, _DLLAPI предопределено.
Вставьте описание изображения здесьТаким образом, DLLAPI представляет __declspec (dllexport) в dll, а DLLAPI представляет __declspec (dllimport) в файле приложения, который вызывает dll. Потому что у вас нет предопределенного _DLLAPI в файле приложения, которое вызывает DLL.
В программе, в которой вы вызываете dll, щелкните правой кнопкой мыши по каталогу properties-configuration properties-linker-general-дополнительная библиотека проекта, добавьте каталог файла lib, созданного проектом dll. Импортируйте файл библиотеки DLL из файла приложения DLL. С помощью оператора #pragma comment (lib, "DLL1.lib")
Вставьте описание изображения здесьпоместите вашу dll в каталог, где находится exe-программа, вызывающая dll, и запустите программу, вызывающую dll.
Вставьте описание изображения здесь5. Использование библиотеки динамических ссылок (вызов дисплея)
Динамически загружайте динамические библиотеки, не используйте оператор #pragma comment (lib, "DLL1.lib"), код файла приложения, который вызывает dll, выглядит следующим образом:
Вставьте описание изображения здесьзапишите имя функции в нем ,? Function @@ YAXXZ, как мы видели в Dependency Walker Имя функции
Вставьте описание изображения здесь Начните выполнение приложения, которое вызывает DLL.
Вставьте описание изображения здесь6. Как сделать экспортированную функцию не переименованной
Первый способ
Компилятор использует синтаксис C ++ при компиляции файла cpp, который изменит имя экспортированной функции динамической библиотеки и изменит функцию на? Function @@ YAXXZ, как указано выше.
Компилятор использует синтаксис языка C при компиляции файла C и не меняет имя экспортируемой функции динамической библиотеки.
Если вы хотите скомпилировать cpp и не хотите изменять имя экспортируемой функции во время компиляции, вы можете добавить extern «C» перед объявлением функции, чтобы сказать компилятору использовать метод компиляции языка C для компиляции.
Вставьте описание изображения здесьВставьте описание изображения здесьЭта функция не была переименована.
Второй способ
использует файлы определения модуля. Щелкните правой кнопкой мыши по исходному файлу под элементом dll project-add-new, выберите файл определения модуля (.def). Создайте новый файл определения.
Вставьте описание изображения здесьНапишите имя модуля dll, который вы хотите экспортировать, и имя функции в модуле dll в этом файле.
Вставьте описание изображения здесьПримечание. С этим файлом def нет необходимости экспортировать функции в файл заголовка dll.
Вставьте описание изображения здесь
Перестройте проект DLL. Проверьте имя экспортируемой функции в Dependency Walker.
Вставьте описание изображения здесь

Опубликовано 3 оригинальные статьи · Лайки0 · Посещения 234

рекомендация

отblog.csdn.net/weixin_34007256/article/details/105346608