0

我在这个问题上花了 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 编译它了。

谷歌搜索“Cmake Lzma”将我带到FindLibLZMA,我不知道他们在写什么。我仍然不知道将哪一行放入我的 CmakeList.txt 文件中,例如add_libraryfind_package...不,什么都没有。

4)

最后,Xz Utils ...据我所知,最广泛的 Lzma 工具,当然不知何故,它也不起作用。

我将文件 FindLibLZMA.cmake(我从 github 拉下来)放入一个名为 Cmake 的文件夹中。然后我加了

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

进入 CmakeList.txt 文件。然后我将LIBLZMA_INCLUDE_DIRFindLibLZMA.cmake 文件中的文件设置为包含 Windows 的 Xz Utils 的文件夹...你猜对了,编译错误:

#   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 库在 Windows 上与 Cmake 一起工作...请...请。谢谢!

4

2 回答 2

1

谢谢一些程序员老兄

对于碰巧在谷歌上搜索的人,为了使 Xz Utils(我尝试过的方法 4)与 Clion 一起在 Cmake 上工作,对于像我这样的新手来说,我现在已经 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 for Windows 下载的包含文件夹的链接。

你很高兴。

据说:lzma_stream_decoder 只接受 .xz 文件,不接受 .lzma 文件。所以,是的,我回到了第一方。

于 2019-02-27T14:24:04.310 回答
0

如果您从 C 中调用 Ada 并不太害怕,那么开源Zip-Ada项目中有一个独立的 .lzma 文件解码器。困难可能在于找到在 Cygwin 上运行的相对较新版本的 GNAT(Ada 的 GCC 编译器)。Windows 的最新版本通常是 MinGW-ish。

于 2019-03-01T09:28:07.570 回答