После добавления #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.