Я потратил 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... Пожалуйста... Пожалуйста. Спасибо!
target_link_libraries
. - person Some programmer dude   schedule 27.02.2019target_link_libraries(YourExecutableTarget "C:\\Path\\To\\library.lib")
- person Some programmer dude   schedule 27.02.2019find_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