Страницы

Поиск по вопросам

среда, 27 марта 2019 г.

Как скомпилить C++ проект

Очень нужна dll'ка получаемая при сборке одного из проектов (любого) в данном репозитории: http://sourceforge.net/p/zint/code/ci/master/tree/
В указанном репозитории, как я понял, несколько вариантов: для qt, VC++ и, я так полагаю, для C++ в GCC. Есть варианты создающие dll и варианты создающие десктопную программу использующую данную dll. Меня интересует именно dll...
Вот только проблема в том, что я ни с чем вышеперечисленным ране не работал на уровне достаточном для того, чтобы уметь собрать проект из файлов представленных в репозитории. Проект для VC++ у меня в 15-ой студии "с наскока" не собрался, ругается на отсутствие: Не удается открыть файл включение: png.h. Которого в директории проекта не наблюдается. В идеале хотелось бы конечно получить рабочую dll'ку именно в VS. Но если не выйдет, то любой другой вариант так же приемлем. Qtшный проект так же ругается (не могу сказать на что именно, в поле вывода абракадабра какая-то...)
Вопрос: Какую последовательность действий мне нужно совершить чтобы скомпилировать один из представленных в репозитории проектов создающий dll библиотеку.
PS: Если кто-то сам скомпилит и кинет ссылку на zint.dll я конечно тоже буду признателен, но всё же хотелось бы знать как это делается.


Ответ

Сборка zint с поддержкой PNG
Сборку будем производить в некотором каталоге %BUILD_ROOT%. Везде в дальнейшем разделителем каталогов должна быть прямая дробная черта (/). При использовании обратной (\) возможны ошибки сборки.
Для сборки в данном случае использовались CMake версии 3.3.2 и MinGW-builds версии 5.2.0rev0.
Сборка библиотеки zlib (использовалась версия 1.2.8).
Скачиваем архив исходников zlib и распаковываем его в каталог %BUILD_ROOT%/zlib. Далее собираем:
cd /d %BUILD_ROOT% mkdir zlib-build cd zlib-build cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%BUILD_ROOT%/zlib-out ../zlib cmake --build . mingw32-make install
После этого в каталоге %BUILD_ROOT%/zlib-out будет скомпилированная библиотека zlib
Сборка библиотеки libpng (использовалась версия 1.6.19).
Скачиваем архив исходников libpng и распаковываем его в каталог %BUILD_ROOT%/libpng. Собираем:
cd /d %BUILD_ROOT% mkdir libpng-build cd libpng-build cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%BUILD_ROOT%/libpng-out -DZLIB_LIBRARY=%BUILD_ROOT%/zlib-out/lib/libzlib.dll.a -DZLIB_INCLUDE_DIR=%BUILD_ROOT%/zlib-out/include ../libpng cmake --build . mingw32-make install
Предупреждения CMake игнорируем. После этого в каталоге %BUILD_ROOT%/libpng-out будет скомпилированная библиотека libpng
Сборка библиотеки zint (использовалась версия 2.4.3).
Скачиваем архив исходников zint и распаковываем его в каталог %BUILD_ROOT%/zint. Файл CMakeLists.txt то ли не подходит для новых версий CMake, то ли в нём изначально ошибка, но в любом случае при сборке возникает ошибка, связанная с невозможностью найти файл png.h. Для исправления ошибки нужно этот файл немного подредактировать, а именно, в 14-й строке заменить ${PNG_INCLUDES} на ${PNG_INCLUDE_DIRS}. Теперь можно собирать:
cd /d %BUILD_ROOT% mkdir zint-build cd zint-build cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%BUILD_ROOT%/zint-out -DZLIB_LIBRARY=%BUILD_ROOT%/zlib-out/lib/libzlib.dll.a -DZLIB_INCLUDE_DIR=%BUILD_ROOT%/zlib-out/include -DPNG_LIBRARY=%BUILD_ROOT%/libpng-out/lib/libpng.dll.a -DPNG_PNG_INCLUDE_DIR=%BUILD_ROOT%/libpng-out/include ../zint cmake --build . mingw32-make install
Предупреждения при сборке игнорируем. После выполнения всех шагов в каталоге %BUILD_ROOT%/zint-out будет требуемая библиотека libzint.dll
Сборка без зависимостей.
Полученная libzint.dll имеет в зависимостях libpng16.dll, а та, в свою очередь, libzlib.dll. Кроме того, все эти библиотеки зависят от libgcc*.dll. Чтобы убрать все эти зависимости и сделать сборку (почти) полностью независимой, можно сделать следующее.
Определяем две переменных:
set CFLAGS=-static set CXXFLAGS=%CFLAGS%
Эти переменные уберут зависимость библиотек от libgcc*.dll
Чтобы убрать зависимость libpng.dll от zlib.dll, исправим один параметр при запуске cmake
-DZLIB_LIBRARY=%BUILD_ROOT%/zlib-out/lib/libzlibstatic.a
А чтобы убрать зависимость libzint.dll от libpng16.dll и libzlib.dll, нужно у cmake исправить два параметра:
-DZLIB_LIBRARY=%BUILD_ROOT%/zlib-out/lib/libzlibstatic.a -DPNG_LIBRARY=%BUILD_ROOT%/libpng-out/lib/libpng.a
Готово! Полученная библиотека зависит только от kernel32.dll и msvcrt.dll

Комментариев нет:

Отправить комментарий