Как собрать библиотеку из исходников windows

Как собрать проект C++ с github из исходников и подключить его к Visual Studio

P.S. В новых сборках Visual Studio проекты из репозиториев открываются просто из меню Файл — Клонировать репозиторий. В статье речь идёт о ситуации, когда так сделать невозможно.

Благодаря менеджеру пакетов winget, уже входящему в актуальные сборки масдайки, теперь в Windows 10 можно инсталлировать приложения одной простой консольной командой
(см. также доку от Микрософта).

Но мы рассмотрим сейчас ситуацию, когда у нас есть только ссылка на исходники проекта, скажем, на Гитхабе
(возьмём для примера библиотеку для простых чисел primesieve) и нужно каким-то образом «вручную» скомпилировать внешний проект в своей Studio, чтобы воспользоваться его возможностями в своём приложении.

В противном случае, конечно же, нестандартный include вроде этого, который вы нашли в коде-образце

#include <primesieve.hpp>

работать не будет ни за что.

Первым делом скачаем все исходники внешнего проекта «как есть» в архиве .zip, для этого у нас на гитхабе есть кнопка «Download ZIP»:

Как загрузить проект с github в архиве .zip

Как загрузить проект с github в архиве .zip

Развернём проект, не создавая новой папки, если у вашего архиватора нет
такого же пункта меню, просто сотрите предлагаемое архиватором имя новой папки, потому что папка уже есть в архиве:

Извлечь внешний проект из архива, не создавая новой папки

Извлечь внешний проект из архива, не создавая новой папки

Если покопаться в файле readme.md проекта, как правило, можно найти инструкцию по установке (Build instructions) и даже «Detailed build instructions», где говорится, в числе прочего, и о компиляции проекта под Microsoft Visual C++:

Команды cmake для компиляции проекта со страницы документации

Команды cmake для компиляции проекта со страницы документации

Откроем свой «некомпилируемый» без нужной библиотеки проект в Studio (я использую актуальную сборку версии 2019) и обратимся к команде меню Вид — Терминал.
Выберем инструмент «Командная строка разработчика» (по умолчанию в новых сборках теперь выбран PowerShell, впрочем, если в документации приведены команды PowerShell, то применяйте их).

У Микрософта инструмент описан вот здесь.

Командная строка разработчика в Studio

Командная строка разработчика в Studio

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

d:
cd \temp\primesieve-master

— теперь я в нужной папке, так как развернул свой архив в папку d:\temp

Далее как написано:

cmake -G "Visual Studio 16 2019" .
cmake --build . --config Release

Можно просто копировать команды со страницы документации, в окне консоли вверху есть стандартная кнопочка «Вставить».
А вот точка в записи команд имеет значение, это ссылка на текущую папку!

Ну и, конечно, для другой версии Studio будет другое указание компилятора, узнать своё можно командой

cmake -G

Нужный генератор будет помечен в списке «звёздочкой» слева в строке с именем.

Если что-то пошло не так, ошибаетесь в консольных командах и получаете
сообщения об ошибках кэша — сотрите файл CMakeCache.txt из папки
скопированного проекта и попробуйте снова.

Теперь проект можно открывать в Studio и работать с ним, все нужные файлы есть в папке d:\temp\primesieve-master

Но мы хотим подключить всё, что нужно, к своему имеющемуся проекту, а не пытаться модифицировать чужую библиотеку.

Примерный путь описан вот здесь, мне же пришлось сделать конкретно следующее:

  • Меню Проект — Свойства, слева выбираем Свойства конфигурации, C/C++, Общие,
    раскрываем поле «Дополнительные каталоги включаемых файлов», говорим «Изменить» и показываем на папку
    D:\Temp\primesieve-master\include . В вашем проекте, как правило, тоже будет вложенная папка include.

  • В том же окне выбираем Компоновщик — Общие — Дополнительные каталоги библиотек, «Изменить» и добавляем путь
    D:\Temp\primesieve-master\Release . Этого может оказаться мало,
    у вашего проекта и внешнего должны быть выбраны одинаковые конфигурации решения.
    Так как я выбрал Release для внешнего проекта, то и в своём проекте в списке «Конфигурации решения» (на стандартной панели инструментов) указал Release и платформу x64.
    Можно было работать и с Debug, но тогда и внешний проект компилируем как Debug и потом выбираем путь D:\Temp\primesieve-master\Debug .

  • В списке C/C++ — Создание кода — Библиотека времени выполнения выбрал
    Многопоточный DLL (/MD), иначе будет «LNK2038: обнаружено несоответствие для ‘RuntimeLibrary’: значение ‘MT_StaticRelease’ не соответствует значению ‘MD_DynamicRelease’ в file.obj».

  • Сам файл библиотеки, как правило имеющий тип .lib, тоже нужно прописать.
    Всё в том же окне свойства проекта выбираем список Компоновщик — Ввод,
    раскрываем список «Дополнительные зависимости», жмём «Изменить» и указываем
    в поле ввода имя файла библиотеки primesieve.lib (полный путь к файлу, папка та же, где находится исполняемый файл primesieve.exe).

  • На всякий случай, проверяем, что у нас в списке
    Компоновщик — Система — Подсистема, у меня там просто Консоль (/SUBSYSTEM:CONSOLE), для других
    типов проектов может понадобиться изменение и этой настройки.

После этого у меня всё заработало.

Ну а конкретная задача, на которой я проверял библиотеку —
печать самых длинных цепочек последовательных простых чисел,
в которых разница между соседними значениями строго возрастает или строго убывает,
предел счёта равен 1000000, вот сама программа:

#include <cstdint>
#include <iostream>
#include <vector>
#include <primesieve.hpp>

void print_diffs(const std::vector<uint64_t>& vec) {
 for (size_t i = 0, n = vec.size(); i != n; ++i) {
  if (i != 0)
   std::cout << " (" << vec[i] - vec[i - 1] << ") ";
  std::cout << vec[i];
 }
 std::cout << '\n';
}

int main() {
 std::vector <uint64_t> asc, desc;
 std::vector <std::vector<uint64_t>> max_asc, max_desc;
 size_t max_asc_len = 0, max_desc_len = 0;
 uint64_t prime;
 const uint64_t limit = 1000000;
 for (primesieve::iterator pi; (prime = pi.next_prime()) < limit; ) {
  size_t alen = asc.size();
  if (alen > 1 && prime - asc[alen - 1] <= asc[alen - 1] - asc[alen - 2])
   asc.erase(asc.begin(), asc.end() - 1);
  asc.push_back(prime);
  if (asc.size() >= max_asc_len) {
   if (asc.size() > max_asc_len) {
    max_asc_len = asc.size();
    max_asc.clear();
   }
   max_asc.push_back(asc);
  }
  size_t dlen = desc.size();
  if (dlen > 1 && prime - desc[dlen - 1] >= desc[dlen - 1] - desc[dlen - 2])
   desc.erase(desc.begin(), desc.end() - 1);
  desc.push_back(prime);
  if (desc.size() >= max_desc_len) {
   if (desc.size() > max_desc_len) {
    max_desc_len = desc.size();
    max_desc.clear();
   }
   max_desc.push_back(desc);
  }
 }
 std::cout << "Longest run(s) of ascending prime gaps up to " << limit << ":\n";
 for (const auto& v : max_asc)
  print_diffs(v);
 std::cout << "\nLongest run(s) of descending prime gaps up to " << limit << ":\n";
 for (const auto& v : max_desc)
  print_diffs(v);
 return 0;
}

Ответы вышли такие:

Longest run(s) of ascending prime gaps up to 1000000:
128981 (2) 128983 (4) 128987 (6) 128993 (8) 129001 (10) 129011 (12) 129023 (14) 129037
402581 (2) 402583 (4) 402587 (6) 402593 (8) 402601 (12) 402613 (18) 402631 (60) 402691
665111 (2) 665113 (4) 665117 (6) 665123 (8) 665131 (10) 665141 (12) 665153 (24) 665177

Longest run(s) of descending prime gaps up to 1000000:
322171 (22) 322193 (20) 322213 (16) 322229 (8) 322237 (6) 322243 (4) 322247 (2) 322249
752207 (44) 752251 (12) 752263 (10) 752273 (8) 752281 (6) 752287 (4) 752291 (2) 752293

За счёт хорошо оптимизированного кода библиотеки считается всё мгновенно.

Это задача из списка задач на простые числа

21.10.2021, 13:15 [16273 просмотра]


К этой статье пока нет комментариев, Ваш будет первым

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

Для C/C++ де-факто стандрата сборки нет, но есть несколько систем сборки, которые обычно используються:

make — очень простая утилита, но неудобно для больших проектов.
Можно определить по наличию файла Makefile. Иногда этот файл генерируеться скриптом configure.
Если есть Makefile, запускаем:
$ make
Удалить сгенерированные файлы (чтобы запустить сборку заново):
$ make clean

cmake— более высокоуровневая система сборки, генерирует проекты для IDE или те же Makefile.
Можно определить по наличию CMakeLists.txt

mkdir cmake-build
# Создаём папку для сгенерированных файлов, чтобы не смешивались с исходниками
# Это называеться out-of-source build
cd cmake-build

# Генерируем проект или Makefile
cmake ..

# Запускаем билд, можно просто запустить make
cmake --build .

qmake — система сборки разработаная для сборки Qt и проектов использующих Qt.
Можно определить по наличию .pro файлов. Билдим так:

qmake
make

В вашем случае используеться make.

Дата публикации: 09.01.2023
Дата последней правки: 10.06.2023

Содержание

  • Введение
  • Процесс сборки
    • Установка требуемых инструментов
    • Клонирование репозитория с исходниками
    • Компиляция
    • Сборка пакетов Python
  • Проверка пакетов
  • Заключение
  • Похожие статьи

Введение

wxPython — это сравнительно легковесная (по сравнению с Qt) библиотека для создания графического интерфейса приложений на языке Python. По сути wxPython является оболочкой над библиотекой wxWidgets, написанной на языке C++. Хотя разработчики wxPython подготавливают бинарные сборки библиотеки под различные операционные системы (Windows, Linux и macOS), но бывают случаи, когда требуется самостоятельно собрать библиотеку из исходников. В частности, для wxPython 4.2.1, на примере которой будет показан процесс сборки в данной статье, на pypi есть сборки только под 64-битные версии Windows, однако библиотека вполне может работать и на 32-битных системах, для этого нужно всего лишь собрать ее из исходников.

Если в системе, для которой отсутствует бинарная сборка, выполнить команду для установки библиотеки

python -m pip install wxpython

то pip попробует собрать пакет из исходников самостоятельно. Если у вас в системе установлены все необходимые библиотеки, то скорее всего это ему даже удастся. Но, во-первых, это процесс достаточно долгий (на моем стареньком i7-3770 этот процесс занимает больше получаса), и поэтому иногда желательно один раз скомпилировать себе требуемую бинарную сборку, а потом ее быстро устанавливать, не ожидая новой пересборки. И, во-вторых, если проблема сборки выявится на этапе компиляции с использованием pip, определить причину неудачи будет сложнее по сравнению со случаем, когда вы будете собирать библиотеку по шагам самостоятельно.

К тому же процесс сборки библиотеки достаточно простой и не требует каких-то особых знаний и шаманств, он подробно описан в документации (в файле README.rst в корне исходников), но кто ж ее читает :), и к тому же могут возникнуть проблемы с отсутствующими библиотеками или требуемыми приложениями для сборки, и поэтому лучше сразу установить все необходимое, чтобы процесс сборки прошел гладко.

Процесс сборки

Установка требуемых инструментов

Для сборки под Windows понадобятся следующие инструменты:

  • git.
  • Python.
  • MS Build Tools с установленной опцией «Desktop Development with C++».
  • graphviz (используется для сборки справки).

Относительно git и Python, я думаю, вопросов быть не должно. Отмечу лишь, что для сборки wxPython вполне можно (и адже это будет правильнее) использовать виртуальное окружение Python с требуемой версией интерпретатора, но в дальнейшем для простоты будем подразумевать, что виртуальное окружение не используется, и требуемые библиотеки установлены глобально.

В дальнейшем процесс сборки я буду показывать на примере использования Python 3.8 32-bit. Эта достаточно старая версия Python выбрана, потому что это последняя версия интерпретатора, которая работает на Windows 7. Если вам нужно, чтобы ваша программа работала на этой пока еще не совсем редкой операционной системе (хорошо хоть не на Windows XP), то придется ограничиться Python 3.8. Ну а 32-битная версия была выбрана из-за того, что бинарная сборка для 64 бит лежит в pypi (в том числе и для Python 3.8), и в большинстве случаев нет смысла ее собирать самостоятельно. Несмотря на использование столь старой версии интерпретатора, примеры будут приводиться при компиляции в Windows 10 64-bit.

С установкой MS Build Tools проблем обычно тоже не возникает. Инсталятор сам прописывает все требуемые пути в переменные окружения, чтобы скрипт сборки мог использовать компилятор C++.

Скриншот инсталятора с выбранной опцией «Desktop Development with C++» показан на следующем рисунке:

build_tools.png: 1280x720, 88k (08.01.2023 11:17)

Что касается Graphviz, то его нужно не просто установить, но и прописать путь до его запускаемого файла в переменной окружения PATH. Если вы устанавливали GraphViz в папку по умолчанию (C:\Program Files\GraphViz), то в PATH нужно добавить путь C:\Program Files\GraphViz\bin:

graphviz_path.png: 619x586, 22k (08.01.2023 11:33)

GraphViz — это инструмент для генерации картинок с диаграммами по текстовому описанию. Он часто используется для создания справки, например, для создания диаграмм наследования классов.

Затем надо установить требуемые для сборки библиотеки для Python:

pip install attrdict3 sip sphinx wheel

Библиотека attrdict используется в скрипте сборки. Эта библиотека предоставляет нестандартную коллекцию, напоминающую словарь, отличие которого заключается в том, что ключи можно запрашивать и через квадратные скобки, и как доступ к свойствам. Одна из плюшек этой библиотеке заключается в том, что она позволяет создавать данный объект по текстовому представлению, например из строки в формате yaml.

Библиотека sip используется для создания Python-обертки над библиотекой, написанной на C++. Об этой библиотеке я когда-то писал статью в двух частях: Создание Python-обвязки для библиотек, написанных на C/C++, с помощью SIP. Часть 1 и часть 2.

Библиотека Sphinx используется для генерации документации.

Библиотека wheel используется для сборки пакетов в формате wheel.

Клонирование репозитория с исходниками

Исходные коды библиотеки wxPython расположены в репозитории github https://github.com/wxWidgets/Phoenix. Такое странное название исторически сложилось как кодовое имя проекта в процессе перехода wxPython с Python 2 на Python 3. Это был долгий и мучительный процесс.

Для начала нужно клонировать исходники из репозитория и перейти в созданную после клонирования папку с исходниками. Для этого в консоли нужно выполнить команды:

git clone https://github.com/wxWidgets/Phoenix
cd Phoenix

clone.png: 978x552, 25k (08.01.2023 12:13)

Затем нужно переключиться на требуемую версию, если только вы не планируете собирать текущую ветку master, которая еще находится в разработке. Например, для версии wxPython 4.2.1 имя тега — «wxPython-4.2.1».

git checkout wxPython-4.2.1

checkout_tag.png: 978x552, 31k (08.01.2023 12:15)

После этого нужно скачать сабмодули и при этом не забыть установить флаг —recursive.

git submodule update —init —recursive

submodules.png: 978x664, 82k (08.01.2023 12:24)

Компиляция

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

Процесс сборки состоит из нескольких этапов. Последовательно их выполним.

Первый шаг подготавливает файлы для будущей документации. Этот шаг требует наличия интернета. Во время его выполнения скрипт проверит, установлена ли у вас программа Doxygen для генерации документации, и если нет, то скачает ее в папку bin, а затем использует ее для генерации файлов документации.

build_dox.png: 978x664, 33k (08.01.2023 12:35)

Следующий шаг сборки:

Этот шаг на основе py-файлов из папки etg создает файлы для дальнейшей компиляции с помощью sip. Новые файлы создаются в папке sip\gen и имеют расширение .sip. Этот процесс уже чуть более долгий.

build_etg.png: 978x664, 68k (08.01.2023 12:43)

Затем запускаем компиляцию с помощью sip:

build_sip.png: 978x664, 44k (08.01.2023 13:02)

И, наконец, запускаем непосредственно компиляцию.

build_build.png: 978x664, 68k (08.01.2023 13:44)

После удачного завершения компиляции бинарная сборка библиотеки будет располагаться в папке wx:

build_result.png: 1125x634, 87k (08.01.2023 13:51)

Сборка пакетов Python

К этому моменту основная часть уже выполнена. Осталось упаковать скомпилированную библиотеку в пакет, который можно будет установить с помощью pip. Для начала можно создать бинарный пакет с помощью команды

Эта операция не займет много времени.

build_bdist.png: 978x792, 71k (08.01.2023 13:55)

В результате ее выполнения будет создан файл wxPython-4.2.1-win32-py3.8.tar.gz (или с похожим именем в зависимости от того, какую версию wxPython вы собираете и под какой интерпретатор) в папке dist

А можно собрать пакет в формате wheel (что в последнее время является предпочтительным). Для сборки пакета в формате wheel нужно выполнить команду:

python build.py bdist_wheel

build_wheel.png: 978x584, 36k (08.01.2023 13:59)

После завершения этой операции в той же папке dist будет создан файл wxPython-4.2.1-cp38-cp38-win32.whl.

packages.png: 904x495, 38k (08.01.2023 14:02)

Проверка пакетов

Убедимся, что только что созданный wheel-пакет работает нормально. Для этого перейдем в папку dist с созданными пакетами и установим wheel-пакет с помощью pip:

cd dist
pip install wxPython-4.2.1-cp38-cp38-win32.whl

При необходимости pip скачает и установит требуемые зависимости (six, pillow, numpy).

pip_install.png: 978x552, 29k (08.01.2023 14:50)

Теперь запустим интерпретатор Python и убедимся, что модуль wx импортируется без ошибок:

python

>>> import wx
>>> wx.__version__
‘4.2.1’

В результате должна быть выведена строка с номером версии wxPython.

import_wx.png: 978x552, 14k (08.01.2023 14:54)

Заключение

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

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

Похожие статьи

  • Компиляция библиотеки wxWidgets в Code::Blocks
  • Сайзеры в wxWidgets / wxPython.
  • Использование Scintilla в wxPython
  • Создание Python-обвязки для библиотек, написанных на C/C++, с помощью SIP. Часть 1
  • Создание Python-обвязки для библиотек, написанных на C/C++, с помощью SIP. Часть 2

Цель собрать статически библиотеки QT для MSVC2010.

Почему может потребоваться msvc, а не mingw32? Например потому-что WMI сервис не получается вызывать под mingw.

Встает вопрос либо допиливать исходники под mingw или перейти на msvc. Попробуем второй вариант.

Устанавливаем QT SDK 1.2.1 на диск D: .

Не забываем установить Perl на Windows. Perl используется утилитой config.exe и нужен будет для создания makefiles для папок исходников.

Запускаем в папке D:\QtSDK1.2.1\QtSources\4.8.1 программу config.exe с ключами через батник:

configure.exe -static -release -opensource -qt-zlib -openssl -webkit -no-fast -no-crt -nomake demos -nomake examples -no-qt3support -no-stl -no-libpng -no-libtiff -no-gif -no-libmng -no-mmx -no-libjpeg -no-iwmmxt -no-phonon -no-phonon-backend -no-multimedia -no-directwrite -no-sql-sqlite2 -no-sql-sqlite -no-rtti -no-sse -no-3dnow -no-opengl -no-sse2 -no-style-plastique -no-style-motif -no-dsp -no-ltcg -no-script -no-scripttools -no-openvg -no-opengl -no-audio-backend > config_static_mingw.txt

В конце видим :

Qt is now configured for building. Just run mingw32-make.
To reconfigure, run mingw32-make confclean and configure.

Но это не совсем то, что нам нужно . Нам надо именно под msvc2010.

Находим пример в интернете, который сработает как надо :

configure -mp -opensource -nomake demos -nomake examples -platform win32-msvc2010
rem  -mp ................ Use multiple processors for compiling with MSVC (-MP)
rem -platform  ... The operating system and compiler you are building on

Далее заходим в QT Creator и собираем проект (вариант msvc2010) . Собранные библиотеки сыпятся в каталог D:\QtSDK1.2.1\QtSources\4.8.1 \lib

Это такие библиотеки как например QtNetwork4.lib / QtNetworkd4.lib / QtNetwork4.dll и QtNetworkd4.dll. То есть статический вариант библиотеки и динамический , плюс два ваританта релизный и отладочный.

Примечание: и это неправда. Библиотеки собраны на самом деле — динамически. Это не статика. А ответ кроется в файле qmake.conf, там смотрите ключ -MD. У библиотек статики на конце цифры 4 не будет.

Через пару часов все библиотеки по-видимому собрались.

Что на самом деле еще надо сделать, чтобы собрать действительно статически смотрите на соседней странице.

So

Posted on

• Edited on

 

 

 

 

 

Introduction

Compiling C (and C++) code in Windows is simple, as all we need is to create a barebones project with everything we need using Visual Studio. But Visual studio and VS code uses telemetry to track usage data. Simply put, VS Code and Visual Studio are spywares. Therefore, in the spirit of OpSec, we can use an alternative compiler that does not spy on code in development.

GCC is an open-source optimizing compiler produced by the GNU Project supporting various programming languages, hardware architectures and operating systems. It is distributed as MinGW and Cygwin for Windows.

This article will show you the basics of creating a DLL for a calculator application and dynamically linking (implicitly) to them in your applications with GCC under MingGW. You can download MinGW from https://sourceforge.net/projects/mingw-w64/

Step 1

We will declare and export our basic function in a header file: calcdll.h

/* calcdll.h

   Declares the functions to be imported by our application, and exported by our
   DLL.
*/

#ifdef CALCDLL_EXPORTS /*  define ADD_EXPORTS *only* when building the DLL. */
  #define CALCDLL_API __declspec(dllexport)
#else
  #define CALCDLL_API __declspec(dllimport)
#endif

/* Define calling convention in one place, for convenience. */
#define CALL __cdecl

/* Make sure functions are exported with C linkage under C++ compilers. */

#ifdef __cplusplus
extern "C"
{
#endif

/* Declare our Add function using the above definitions. */
CALCDLL_API int CALL Add(int a, int b);
CALCDLL_API int CALL Subtract(int a, int b);
CALCDLL_API int CALL Divide(int a, int b);
CALCDLL_API int CALL Multiply(int a, int b);

#ifdef __cplusplus
} // __cplusplus defined.
#endif

Enter fullscreen mode

Exit fullscreen mode

The __declspec(dllexport) attribute defined as CALCDLL_API in the code is the key to exporting functions from the DLL, and every function you would like to export from the DLL should be marked with this.

Also notice the “__cdecl” (defined as CALL) before the function name. This declares the calling convention for the function (see the Wikipedia article on x86 calling conventions if you’re not familiar with them).

The default calling convention for C functions in MinGW is cdecl, but it’s a good idea to always explicitly state the calling convention in case some other compiler has a different default. If this happens, your application will likely misbehave or crash as a result of calling one of these functions.

Step 2

We will define our basic functions in calcdll.c

/* calcdll.c

Demonstrates creating a DLL with exported functions
*/

#include "calcdll.h"

int CALL Add(int a, int b) {
  return (a + b);
}

int CALL Subtract(int a, int b) {
  return (a - b);
} 

int CALL Divide(int a, int b) {
  return (a/b);
}

int CALL Multiply(int a, int b) {
  return (a * b);
}

Enter fullscreen mode

Exit fullscreen mode

Then, we will compile this DLL. It is necessary to define “CALCDLL_EXPORTS” when compiling the object code, to ensure “CALCDLL_API” is correctly defined in the header. This is done most easily by passing a “-D CALCDLL_EXPORTS” on the command line. We will use a batch file for this: build.bat

/* build.bat

Demonstrates compiling a DLL using a batch file
*/
gcc -c -o calcdll.o calcdll.c -D CALCDLL_EXPORTS
gcc -o calcdll.dll calcdll.o -s -shared -Wl,--subsystem,windows

Enter fullscreen mode

Exit fullscreen mode

Run batch file on CMD

C:\Users\sokearth\Documents\CALC>build.bat

Enter fullscreen mode

Exit fullscreen mode

Step 3

Let’s create our calculator application to utilize our dll

/* calc.c

   Demonstrates using the function imported from the DLL.
*/

#include <stdlib.h>
#include <stdio.h>
#include "calcdll.h"

int main() {
  int a, b, c, d;
  a = Add(10, 5)
  printf("Addition = %d\n", a);

  b = Subtract(10, 5)
  printf("Subtraction = %d\n", b);

  c = Divide(10, 5)
  printf("Division = %d\n", c);

  d = Multiply(10, 5)
  printf("Multiplication = %d\n", d);

  return 0;
}

Enter fullscreen mode

Exit fullscreen mode

For the second to last step, we will compile the code to our calculator application into an exe file and run it using another batch file: build_exe.bat

/* build_exe.bat

Demonstrates compiling and running calculator app using a batch file
*/

gcc -c -o calc.o calc.c
gcc -o calc.exe -s calc.o -L. -lcalcdll
calc.exe

Enter fullscreen mode

Exit fullscreen mode

Finally, run batch file on CMD

C:\Users\sokearth\Documents\CALC>build_exe.bat

Enter fullscreen mode

Exit fullscreen mode

Note

This article demonstrates implicit dynamic linking with GCC. For a guide on how to do explicit dynamic linking, check out the next article on my OpSec series.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • 0x0000221 windows 10 при загрузке
  • Почему не получается сбросить windows 10 до заводских настроек
  • Как включить изменение расширения файла windows 11
  • Windows 10 usb dvd download tool как пользоваться
  • Терминальный сервер на windows server 2019 без домена