Разделите свою программу на отдельные компоненты, чтобы упростить развертывание и установку.

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

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

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

Программа, использующая DLL, имеет следующие преимущества:

  • Использует меньше ресурсов
  • Продвигает модульную архитектуру
  • Упрощает развертывание и установку

В этом уроке 4 раздела:

  1. Настраивать
  2. Выполнение
  3. линукс
  4. Вывод

Перейдем к следующему разделу и приступим к установке необходимого ПО.

1. Настройка

Убедитесь, что у вас есть возможность компилировать код C/C++ в исполняемые файлы и общие библиотеки. Я буду использовать Microsoft Visual Studio Community 2017 в качестве компилятора для этого проекта. Убедитесь, что вы установили расширение Visual C++, позволяющее создавать проект C++.

Общие библиотеки называются библиотеками динамической компоновки (.dll) на платформе Windows. На других платформах он идентифицируется как общий объект с использованием расширения .so.

2. Реализация

Visual Studio предоставляет нам собственную командную строку разработчика, которая позволяет нам компилировать исполняемые файлы. Найдите Native Tools Command Prompt for VS в каталоге Visual Studio.

В этом руководстве я использую x64 для компиляции 64-битных библиотек с динамической компоновкой, поскольку имеющаяся у меня версия Python основана на 64-битной архитектуре. Если вы компилируете 32-битные библиотеки динамической компоновки, вы можете использовать их только в 32-битной среде. Откройте его, и вы должны увидеть следующий терминал.

Перед этим создайте следующие папки в корневом каталоге.

  • include — Для хранения заголовочных файлов. Файлы заголовков будут использоваться в качестве справки о том, как взаимодействовать с скомпилированными разделяемыми библиотеками. Файлы заголовков необходимы, если другие разработчики хотят использовать ваши общие библиотеки для разработки своей собственной программы.
  • obj — Для хранения временных obj-файлов, созданных во время компиляции. Вы можете безопасно удалить эти файлы.
  • src — Для хранения основного кода ваших функций. Во время развертывания вы исключите эти файлы из пакета. Предоставляйте клиентам, использовавшим вашу программу, только общие библиотеки и исполняемые файлы.

Заголовок

Внутри папки include давайте создадим новый файл с именем add.h. Не стесняйтесь называть его как угодно. Откройте его и добавьте следующий код.

#ifndef _ADD_H
#define _ADD_H
extern "C"
{
    __declspec(dllexport) int add(int, int);
    __declspec(dllexport) int sub(int, int);
    __declspec(dllexport) int mul(int, int);
}
#endif

Если вы кодируете на c, просто используйте весь заголовок без extern и delspec(dllexport).

int add(int, int);
int sub(int, int);
int mul(int, int);

Код реализации

Перейдите в папку src и создайте новый файл. Я назвал его add.cpp для простоты. Реализуйте внутри него необходимый код.

#include "add.h"
extern "C"
{
    __declspec(dllexport) int add(int a, int b) 
    {
        return a + b;
    }
    __declspec(dllexport) int sub(int a, int b)
    {
        return a - b;
    }
    __declspec(dllexport) int mul(int a, int b)
    {
        return a * b;
    }
}

Главный

Вернитесь в корневой каталог и создайте новый файл с именем main.cpp.

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

#include <iostream>
#include "add.h"
int main() {
    std::cout << add(2, 2) << " | " << sub(3, 1) << " | " << mul(3, 3) << std::endl;
    return 0;
}

Объектные файлы

Вернитесь к командной строке, которую мы открыли ранее. Убедитесь, что он указывает на корневой каталог, где находится main.cpp. Выполните следующую команду.

cl /EHsc /c .\src\*.cpp /I .\include /Fo".\obj\\"
  • /c — Расположение исходных файлов. Используйте звездочку, чтобы включить все файлы cpp в папку src.
  • /I —Расположение заголовочных файлов. По умолчанию он будет включать файлы с расширением .h.
  • /Fo — расположение временных obj-файлов, которые будут созданы во время компиляции. Обратите внимание, что после этой команды не должно быть лишнего пробела.

Вы должны увидеть следующий вывод

Вы можете найти только что созданный файл с именем app.obj внутри папки obj.

Динамические библиотеки

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

link /DLL /OUT:add.dll .\obj\*.obj

Вы должны увидеть следующий вывод

В корневой папке у вас должны быть следующие файлы.

  • add.dll — Общая библиотека для вашей программы. Это необходимо вашему исполняемому файлу для запуска соответствующих функций.
  • add.exp — Файл библиотеки экспорта. Вы можете смело удалить этот файл.
  • add.lib — статическая библиотека, необходимая при компиляции для создания исполняемого файла.

Запускаемый файл

Последняя часть — создание исполняемого файла. Выполните следующую команду. Мы будем использовать файл .lib вместо .dll, поскольку для компиляции требуется статическая библиотека, а библиотека динамической компоновки используется для запуска исполняемого файла после компиляции.

cl /EHsc main.cpp /Fetest.exe /I .\include /link *.lib

Вы должны увидеть следующий вывод

Внутри корневой папки у вас должен быть файл test.exe, в котором вы можете запустить его напрямую.

Не удивляйтесь, если программа закроется вскоре после того, как вы ее открыли. Это в основном потому, что он завершил выполнение кода и закрылся. Давайте попробуем запустить его внутри терминала, чтобы зафиксировать вывод. Просто введите имя исполняемого файла. Расширение .exe можно не указывать.

test.exe

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

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

  • test.exe
  • add.dll

3. Линукс (Убунту)

Обратите внимание, что UNIX не использует DLL. Формат файла, используемый в Linux, называется общим объектом и заканчивается расширением .so.

Основываясь на комментариях других читателей, вы также можете использовать g++ для его компиляции, но это требует некоторой работы. Следующие инструкции основаны на gcc и могут быть устаревшими. Настоятельно рекомендуется также ознакомиться с другими руководствами и действовать осторожно.

gcc

Для пользователя Linux вам необходимо установить gcc. Прежде всего, обновите список пакетов.

sudo apt-get update

Вы можете установить его напрямую следующим образом:

sudo apt-get install gcc

или через основной пакет сборки

sudo apt-get install build-essential

Выполните следующую команду, чтобы убедиться, что вы правильно установили gcc.

gcc --version

Если вы используете другую архитектуру, такую ​​как CentOS, просто замените apt-get соответствующей командой.

Компиляция в Linux осуществляется с помощью следующей команды. Пожалуйста, ознакомьтесь с документацией gcc о том, как связать заголовочные файлы и файлы реализации и изменить их соответствующим образом.

gcc main.cpp -o main

Просто запустите исполняемый файл следующим образом

./main

Вы должны увидеть вывод исполняемой программы на вашей консоли.

3. Заключение

Подведем итог тому, что мы сегодня узнали.

Мы начали с установки компилятора для нашего проекта. В данном случае я установил Microsoft Visual Studio Community 2017 с расширением Visual C++.

Затем мы написали код на C++, который послужил базовой функциональностью для нашей общей библиотеки. После этого мы скомпилировали код в dll и создали из него исполняемый файл. Мы запустили программу внутри терминала, чтобы проверить функциональность, которая работала должным образом.

Кроме того, я предоставил дополнительное объяснение того, как компилировать в Linux, которое может быть полезно для тех, кто собирается создавать разделяемые библиотеки на платформе Linux.

Спасибо за чтение этого произведения. Надеюсь увидеть вас снова в следующей статье!

Ссылка

  1. Учебное пособие по созданию библиотеки DLL для Youtube
  2. Что такое DLL?