Безболезненный способ компиляции библиотеки lzma в Windows с помощью Cmake / CLion? - PullRequest
0 голосов
/ 27 февраля 2019

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

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

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

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

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

1)

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

#include <lzma.h>

Хорошо, простоне работает на винде.Когда я скомпилировал, я получил ошибку:

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 ... Пожалуйста ... Пожалуйста.Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

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

0 голосов
/ 27 февраля 2019

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

Для всех, кто случайно попробует это Google, чтобы заставить 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")

с помощью "LINK "- это ссылка на папку включения, которую вы скачали с XZ Utils для Windows.

И вы готовы идти.

ЭТО СКАЗАЛ: только lzma_stream_decoderпринять файл .xz, а не файл .lzma.Так что да, я вернулся на круги своя.

...