[RESOLVIDO]Qt necessitas e LZMA
-
Olá.. gente estou tentando trabalhar com compressão no necessitas, no qtsdk para windows e linux é fácil, mas estou com problema para encontrar a mesma lib para o android. sei que devo compilar por exemplo a lib xz-embedded para "arm" pois para x86 e x64 ja existem em .dll e .so mas sinceramente não estou me saindo muito bem nem sei por onde começar, não sei como incluir os parâmetros para tentar compilar.
Bem, não precisa ser LZMA mas pelo menos uma compressão melhor que eu consegui colocar para funcionar que é a qCompress e qUncompress.
Obs:
Com qcompress tivess sucesso mas a compressão não é lá essas coisas, um arquivo de 2.5 MB foi para 800 KB mas preciso fazer com que ela chegue a 500KB ~ 600 KB que é justamente o que consigo gerando um arquivo .zip ou 7z. -
Flavio,
Dei uma olhada rápida no SDK do LZMA, e acho que é tranquilo incluir os fontes do SDK no seu projeto.
Fiz um teste rápido aqui, incluindo o diretório "C" que tem no pacote do SDK num projeto de teste e o QT compila tranquilo. O Necessitas deve compilar também de boa.
Com isso, você não faria uma chamada para um executável externo, mas sim, a funções dentro do seu programa.No SDK tem um arquivo chamado "LzmaUtil.c", que tem os exemplos de como usar a API. Me parece simples.
Para não misturar os seus fontes com os fontes do LZMA, descompacte o SDK em outro dir (por exemplo c:\Lib\LZMA). Clique em adicionar "arquivos existentes" ao projeto, e inclua todos os arquivos de "c:\lib\LZMA\C". Depois abra seu arquivo .PRO e coloque:
INCLUDEPATH = c:/lib/lzma/C
(no meu teste coloquei um path relativo....)
Depois é só abrir o "LzmaUtil.c" e fazer uns "Ctrl+C Ctrl+V" :)
-
Tentei fazer como você sugeriu,
1- Fiz o download de :
http://www.7-zip.org/sdk.html e entao http://downloads.sourceforge.net/sevenzip/lzma920.tar.bz22- descomprimir numa pasta apenas para coisa relacionadas com os projetos qt
3-criei um projeto vazio no qt.
4-inclui os o local INCLUDEPATH += D:/qt/lzma920/C
5-“LzmaUtil.c” e copie o conteúdo mas não dei certo então copie da linha 1 ate a linha 19, que achei um código pequeno e sem relação com o restante
e deu os seguintes erros21:09:36: Running build steps for project untitled1...
21:09:36: Configuration unchanged, skipping qmake step.
21:09:36: Starting: "D:\qt\qtcreator-2.4.0\mingw\bin\mingw32-make.exe"
D:/qt/qtcreator-2.4.0/mingw/bin/mingw32-make.exe -f Makefile.Debug
mingw32-make.exe[1]: Entering directoryD:/qt/projects/untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug' g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\4.7.4w32\include\QtCore" -I"..\..\4.7.4w32\include\QtGui" -I"..\..\4.7.4w32\include" -I"..\..\lzma920\C" -I"..\..\4.7.4w32\include\ActiveQt" -I"debug" -I"." -I"..\untitled1" -I"." -I"..\..\4.7.4w32\mkspecs\win32-g++" -o debug\mainwindow.o ..\untitled1\mainwindow.cpp ..\untitled1\mainwindow.cpp:24: warning: 'g_Alloc' defined but not used g++ -mthreads -Wl,-subsystem,windows -o debug\untitled1.exe debug/main.o debug/mainwindow.o debug/moc_mainwindow.o -L"d:\qt\4.7.4w32\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4 mingw32-make.exe[1]: Leaving directory
D:/qt/projects/untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug'
debug/mainwindow.o: In functionSzAlloc': D:\qt\projects\untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug/../untitled1/mainwindow.cpp:22: undefined reference to
MyAlloc'
debug/mainwindow.o: In functionSzFree': D:\qt\projects\untitled1-build-desktop-Qt_4_7_4__4_7_4w32__Debug/../untitled1/mainwindow.cpp:23: undefined reference to
MyFree'
collect2: ld returned 1 exit status
mingw32-make.exe[1]: *** [debug\untitled1.exe] Error 1
mingw32-make.exe: *** [debug] Error 2
21:09:38: The process "D:\qt\qtcreator-2.4.0\mingw\bin\mingw32-make.exe" exited with code 2.
Error while building project untitled1 (target: Desktop)
When executing build step 'Make' -
Você adicionou os arquivos ao projeto?
!http://s18.postimage.org/fiwkib7qx/Add_Exists_File.png!Está dando erro, pois justamente não está achando os símbolos necessários (no caso a função MyAlloc - que está definida em Alloc.h e implementada em Alloc.c).
-
Fiz aqui e funcionou mesmo apenas o INCLUDEPATH não resolveria, foi mal to migrando do delphi para C++ e estou tendo uma certa dificuldade principalmente em botar para funcionar bibliotecas como essa da lzma. Mas notei que essa lzmaUtil apenas comprime um buffer. é claro tentei fazer utilizar 7z.h e novamente depois de algumas horas me senti perdido de novo porque não consegui fazer funcionar e documentação infelizmente não achei nada que me ajudasse. Você por um acaso não passou por um exemplo mais simplificado com o lzmasdk em algum lugar não né?
exemplo tipo:
bool compress(qstring filesouce, qstring filedestin);
bool decompress(qstring filesouce, qstring filedestin); -
Eu realmente não fiz um estudo do LZMA. Apenas uma olhada rápida. Mas dê uma olhada no método main2, que ele faz exatamente o que você quer: compactar um arquivo.
-
bem, utilizando o "main2" como orientação deu certo sim, precisou apenas dos seguintes passos:
1-Mudei nome da "lzmautil.c" para "lzmautilteste.c"
2-nele criei mais duas funções mais simples compress e decompress baseadas em "main2"
int compress(char *inFileName,char *outFileName)
{char rs[800] = { 0 };
CFileSeqInStream inStream;
CFileOutStream outStream;
int res;FileSeqInStream_CreateVTable(&inStream);
File_Construct(&inStream.file);FileOutStream_CreateVTable(&outStream);
File_Construct(&outStream.file);{
size_t t4 = sizeof(UInt32);
size_t t8 = sizeof(UInt64);
if (t4 != 4 || t8 != 8)
return PrintError(rs, "Incorrect UInt32 or UInt64");
}if (InFile_Open(&inStream.file, inFileName) != 0)
return PrintError(rs, "Can not open input file");if (OutFile_Open(&outStream.file, outFileName ) != 0) return PrintError(rs, "Can not open output file"); UInt64 fileSize; File_GetLength(&inStream.file, &fileSize); res = Encode(&outStream.s, &inStream.s, fileSize, rs); File_Close(&outStream.file); File_Close(&inStream.file);
if (res != SZ_OK)
{
if (res == SZ_ERROR_MEM)
return PrintError(rs, kCantAllocateMessage);
else if (res == SZ_ERROR_DATA)
return PrintError(rs, kDataErrorMessage);
else if (res == SZ_ERROR_WRITE)
return PrintError(rs, kCantWriteMessage);
else if (res == SZ_ERROR_READ)
return PrintError(rs, kCantReadMessage);
return PrintErrorNumber(rs, res);
}
return 0;
}int Decompress(char *inFileName,char *outFileName)
{
char rs[800] = { 0 };
CFileSeqInStream inStream;
CFileOutStream outStream;
int res;
//Bool useOutFile = False;FileSeqInStream_CreateVTable(&inStream);
File_Construct(&inStream.file);FileOutStream_CreateVTable(&outStream);
File_Construct(&outStream.file);size_t t4 = sizeof(UInt32); size_t t8 = sizeof(UInt64); if (t4 != 4 || t8 != 8) return PrintError(rs, "Incorrect UInt32 or UInt64");
if (InFile_Open(&inStream.file, inFileName) != 0)
return PrintError(rs, "Can not open input file");if (OutFile_Open(&outStream.file, outFileName) != 0) return PrintError(rs, "Can not open output file"); res = Decode(&outStream.s, &inStream.s);
File_Close(&outStream.file);
File_Close(&inStream.file);if (res != SZ_OK)
{
if (res == SZ_ERROR_MEM)
return PrintError(rs, kCantAllocateMessage);
else if (res == SZ_ERROR_DATA)
return PrintError(rs, kDataErrorMessage);
else if (res == SZ_ERROR_WRITE)
return PrintError(rs, kCantWriteMessage);
else if (res == SZ_ERROR_READ)
return PrintError(rs, kCantReadMessage);
return PrintErrorNumber(rs, res);
}
return 0;
}3-coloquei o include do novo arquivo no projeto, ai foi fácil apenas chamei a função e pronto, não gerar um 7z com cabeçalho e tudo mais, mas gera uma compressão boa e pode ainda extraído pelo proprio 7zip
#include <QtGui/QApplication>
#include "mainwindow.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include "lzma920/C/Util/Lzma/LzmaUtiltest.c"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//MainWindow w;
//w.show();char *inFileName="c:/dbforcacad001.db"; char *outFileName="c:/dbforcacad001.lzma"; compress(inFileName,outFileName); inFileName=outFileName; outFileName="c:/dbforcacad001.lzma.db"; Decompress(inFileName,outFileName); //return a.exec();
}
Valeu a ajuda obrigado
-
Flavio,
De nada. Estamos aqui para isso mesmo!
Seguindo a boa prática do fórum, acho que você poderia editar o título do do post para [SOLVED] ([RESOLVIDO] talvez?) para facilitar a leitura de quem procura algo no fórum.
1/8