Безболезненный способ скомпилировать библиотеку lzma в Windows с помощью Cmake/CLion?

Я потратил 2 дня на эту проблему, и до сих пор не знаю, как это сделать.

Все, что я пытаюсь сделать, это создать программу или, скорее, функцию на C, которая будет принимать сжатый файл lzma и извлекать его в Windows. Я делаю это с CLion, с Cygwin 64 3.0.1.

Звучит легко? Наверное, за исключением того, что все способы, которые я перепробовал, просто не работают.

Позвольте мне сначала понять, что я не знаком с Cmake, поэтому в значительной степени поэтому я прошу совета.

Методы, которые я пробовал:

1)

Просматривая много кода на github, я просто вижу, что они делают

#include <lzma.h>

Красиво, только не работает в Windows. При компиляции получаю ошибку:

undefined reference to `lzma_stream_decoder'
undefined reference to `lzma_code'

Погуглив, скажите мне, что мне не хватает библиотеки для разработки lzma, и решение просто сделать sudo apt, и... как вы догадываетесь: не для Windows.

2)

Возможно, это особенность Cmake, так что давайте сначала попробуем скомпилировать с помощью простого gcc. Я взял простой код распаковки с помощью #include <lzma.h> и попытался скомпилировать его в Ubuntu. Круто, все прошло гладко.

Вернувшись к Windows, я открыл терминал Cygwin. О, конечно, в Cygwin я скачал liblzma-devel.

Компиляция работает отлично. НО при запуске исполняемого файла:

cygwin1.dll and cyglzma-5.dll are missing

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

3)

Вернемся к Clion/Cmake.

Я заглянул в Lzma SDK и ничего не дал. Какой код я должен написать в файл Cmake? Я не могу найти никакого руководства, в котором говорится, как использовать это в C, не говоря уже о том, чтобы скомпилировать его с помощью Cmake.

Поиск в Google «Cmake Lzma» привел меня к FindLibLZMA, который у меня есть. непонятно о чем пишут. Я до сих пор понятия не имею, какую строку поместить в мой файл CmakeList.txt, например, add_library или find_package... нет, ничего.

4)

Наконец, Xz Utils... самый обширный инструмент Lzma, насколько я понимаю, и, конечно, как-то , тоже не работает.

Я поместил файл FindLibLZMA.cmake (который я вытащил из github) в папку с именем Cmake. Затем я добавил

find_package(LibLZMA REQUIRED)
include_directories(${LIBLZMA_INCLUDE_DIRS})

в файл CmakeList.txt. Затем я установил LIBLZMA_INCLUDE_DIR в файле FindLibLZMA.cmake в папку, включающую Xz Utils для Windows... и угадайте, ошибка компиляции:

#   LIBLZMA_HAS_AUTO_DECODER  - True if lzma_auto_decoder() is found (required).
#   LIBLZMA_HAS_EASY_ENCODER  - True if lzma_easy_encoder() is found (required).
#   LIBLZMA_HAS_LZMA_PRESET   - True if lzma_lzma_preset() is found (required).

Нужны все эти библиотеки или что-то в этом роде, но где они? Компилятор не смог его найти, так что да... опять я застрял.

Я пытался со вчерашнего дня, и я все еще застрял.

Так что, пожалуйста, я очень устал сейчас. Любая добрая душа подскажет, как заставить библиотеку Lzma работать с Cmake в Windows... Пожалуйста... Пожалуйста. Спасибо!


person Nguyễn Thu Phương    schedule 27.02.2019    source источник
comment
В первом примере вам нужно связать с фактическим файлом библиотеки. В CMake это делается с помощью target_link_libraries.   -  person Some programmer dude    schedule 27.02.2019
comment
Опять же, я не знаком с Cmake, но если я хочу использовать target_link_library, нужно ли мне сначала использовать ADD_LIBRARY? И если я это сделаю, мне нужно знать все файлы в библиотеке? Откуда я могу это знать?   -  person Nguyễn Thu Phương    schedule 27.02.2019
comment
Вы можете использовать полный путь к библиотеке на диске, если хотите. Как в target_link_libraries(YourExecutableTarget "C:\\Path\\To\\library.lib")   -  person Some programmer dude    schedule 27.02.2019
comment
Кроме того, find_package(LibLZMA REQUIRED) должен установить LIBLZMA_LIBRARIES, который вы можете передать target_link_libraries. Как в target_link_libraries(YourExecutableTarget ${LIBLZMA_LIBRARIES}). Или еще лучше использовать импортированную цель LibLZMA::LibLZMA (как в target_link_libraries(YourExecutableTarget LibLZMA::LibLZMA))   -  person Some programmer dude    schedule 27.02.2019
comment
Так как только второй вариант позволяет успешно собрать программу, я бы посоветовал остановиться на нем и предоставить более подробную информацию об ошибке. Начните с точного сообщения об ошибке и расположения файлов (исполняемых файлов, библиотек).   -  person Tsyvarev    schedule 27.02.2019


Ответы (2)


Спасибо, какой-то чувак-программист.

Для тех, кто случайно погуглил это, чтобы заставить Xz Utils (метод 4, который я пробовал) работать на Cmake с Clion, я сейчас очень 101 здесь для любого новичка, такого как я:

1) Создайте папку с именем Cmake в исходной папке вашего проекта.

2) Поместите файл FindLibLZMA.Cmake в эту папку.

3) Добавьте эти строки в свой CMakeList.txt.

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/Cmake")
find_package(LibLZMA REQUIRED)
include_directories(${LIBLZMA_INCLUDE_DIRS})
target_link_libraries(DukasCompiler ${LIBLZMA_LIBRARIES})

4) Открываем FindLibLZMA.Cmake и в начале добавляем

set(LIBLZMA_INCLUDE_DIR "LINK")

с «ССЫЛКОЙ» — это ссылка на включаемую папку, которую вы загрузили из XZ Utils для Windows.

И вы можете идти.

ПРИ ЭТОМ: lzma_stream_decoder принимает только файл .xz, а не файл .lzma. Так что да, я вернулся к исходной точке.

person Nguyễn Thu Phương    schedule 27.02.2019

Если вы не слишком боитесь вызывать Аду из C, есть автономный декодер для файлов .lzma в Zip-Ada проекта. Трудность может заключаться в том, чтобы найти относительно новую версию GNAT (компилятор GCC для Ады), работающую на Cygwin. Обновленные версии для Windows обычно относятся к MinGW.

person Zerte    schedule 01.03.2019