개발 · 컴퓨터공학 / / 2024. 5. 15. 09:41

libzippp 정적 라이브러리 테스트 + 어떤 방식으로는 실행시켜보기

반응형

libzippp 라이브러리를 실행할 수 있게끔 테스트가 필요하다.

동적 라이브러리 dll이 아니라 정적 라이브러리 lib 중 static library로 생성하는 방법을 시도해본다.

아래 사이트에 정적 static 라이브러리로 생성하는 방법이 있는데, 빈 프로젝트에서 시도하는 것을 추천한다고 한다. 해당 과정을 따라해보도록 하자.

 

준비

 

 

아래 사이트에서는 libzippp compile을 위해 미리 준비된 파일을 가져온다.

 

 

libzippp-v7.1-1.10.1-windows-ready_to_compile.zip

위 파일을 풀고 컴파일해서 소스코드들을 가져올 것이다.

 

먼저 libzippp 프로젝트와 테스트 프로젝트를 준비하고 libzippp을 사용할 수 있도록 DLL을 사용하는 세팅인 /MD에서 static 라이브러리를 사용하는 /MT로 변경하라고 한다.

 

정적 라이브러리 사용을 위한 세팅

먼저 lib 폴더를 만들고 정적 라이브러리 파일들을 여기다가 관리할 것이다

 

그러므로 라이브러리 디렉터리 설정을 해주고 추가 종속성을 넣어주어야한다

 

일단 libzippp 윈도우용 라이브러리 컴파일 배치파일을 통해 라이브러리를 컴파일해준다

 

컴파일이 완료되면 필요한 라이브러리와 파일들을 테스트 프로젝트로 가져와서 실행해보자

 

먼저 dist release에 있는 libzippp 라이브러리와 헤더를 가져온다 

일단 static lib 파일은 냅두자

 

libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.10.1

그리고 위 두 경로에서 zlib와 libzip의 라이브러리와 소스를 가져오면 될 것 같다

 

You can either use libzippp.dll and libzippp.lib to link dynamically the library or simply use libzippp_static.lib to link it statically. Unless you also link zlib and libzippp statically, you'll need the dll packaged with your executable.

위 내용의 즉슨 dll와 lib 둘 다를 사용하는 방법과 static.lib를 사용하는 두 가지 방법을 말하고 있다.

즉 lib가 아니라 static lib를 가져와야한다.

 

static lib와 헤더를 가져오자

 

프로젝트에서 테스트

일단 include에서 에러는 안생기고 실행시 문제는 없다

 

그러면 libzippp함수가 잘 실행되서 zip파일이 생성되는지 함수 테스트를 해보자

 

#include <iostream>
#include "main.h"
#include "libzippp.h"
using namespace std;

int main() {
	cout << "Libzippp Test" << "\n";

	// zip test
	libzippp::ZipArchive zip("../test.zip");
	if (!zip.open(libzippp::ZipArchive::New)) {
		std::cerr << "Failed to open file for writing: " << "test " << std::endl;
	}
	//zip.addEntry(filepath + filename + "3MF" + "/[Content_Types].xml");
	//zip.addEntry(filepath + filename + "3MF/_rels" + "/.rels");
	//zip.addEntry(filepath + filename + "3MF/3D" + "/3DModel.model");

	zip.close();

	return 0;
}

위 코드로 테스트를 해볼 것이다

 

...오류가 생긴다

 

libzippp에서 필요한 zlib이나 libzip에 대한 static 라이브러리도 필요한 모양이다

 

컴파일된 libzippp의 lib폴더에서 찾도록 한다

 

libzip에서는 zip.lib와 (lib/install 경로에도 같은 것이 있음)

 

소스 코드들 모두를 가져왔다 (가져오지 않기)

 

zlib은 static 라이브러리 두 개

 

그리고 include의 헤더파일들을 가져온다

 

가져온 헤더파일들을 솔루션에 추가해보자

 

그래도 에러는 생긴다

 

static으로 설정하는 방법이 따로 있는 것일까

 

종속성 편집

여기에 안넣었기 때문이 아닐까 싶어 넣어서 해본다 

 

오류가 확연히 줄긴 했다

 

Debug로 설정된 것이 문제가 되려나

 

release로 바꾸니까 오히려 에러가 생긴다 

 

뭔가를 더 추가해야하는 듯 한데...

 

종속성을 다시 검토해보니 빠진게 있어서 올바르게 수정하고 빌드했다

 

에러 하나만 해결하면 된다 

static.lib 파일이 없다는데 이게 뭔가. 이미 다 넣었는데 말이다 

프로젝트 속성 수정

C/C++ 추가 포함 디렉터리 옵션을 설정해주었다

해도 상황은 똑같다

 

다른 라이브러리도 넣기

이렇게 된거 static이외의 다른 라이브러리도 넣어보자

 

넣고 넣고 추가 종속성 설정도 해주고 실행해보자 

 

... 그래도 같은 오류가 발생한다

 

DLL 넣어보기

dll로 함수 실행이라도 제대로 되는지 보고 싶다

 

dll을 적용하려면 단순히 프로젝트에 옮겨넣는것 말고 추가적인 작업이 필요하다

 

프로젝트 속성의 포함 디렉터리를 바꾸어주고

 

참조 디렉터리에도 프로젝트 경로를 넣어준다

 

그래도 안된다. 다른 방법을 찾아보자

 

compile.bat 수정

cmake 빌드를 한 번에 하도록 만든 compile.bat 파일을 다음과 같이 수정해서 작업해본다

 

@echo off

SET root=%cd%
SET zlib=lib\zlib-1.3.1
SET libzip=lib\libzip-1.10.1

if not exist "%zlib%" goto error_zlib_not_found
if not exist "%libzip%" goto error_libzip_not_found

:compile_zlib
if exist "%zlib%\build\.compiled" goto compile_libzip
echo =============================
echo Compiling zlib...
echo =============================
cd "%zlib%"
mkdir build
cd "build"
cmake ".." -A x64 -DCMAKE_INSTALL_PREFIX="%root%/lib/install"
if %ERRORLEVEL% GEQ 1 goto error_zlib
cmake --build "." --config Debug --target install
if %ERRORLEVEL% GEQ 1 goto error_zlib
cmake --build "." --config Release --target install
if %ERRORLEVEL% GEQ 1 goto error_zlib
echo "OK" > ".compiled"
cd "..\..\.."

:compile_libzip
echo =============================
echo Compiling libzip...
echo =============================
cd "%libzip%"
mkdir "build"
cd "build"
cmake ".." -A x64 -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX="%root%/lib/install" -DCMAKE_PREFIX_PATH="%root%/lib/install" -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=ON -DBUILD_TOOLS=OFF -DBUILD_REGRESS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOC=OFF
if %ERRORLEVEL% GEQ 1 goto error_libzip
cmake --build . --config Debug --target install
if %ERRORLEVEL% GEQ 1 goto error_libzip
cmake --build . --config Release --target install
if %ERRORLEVEL% GEQ 1 goto error_libzip
echo "OK" > ".compiled"
cd "..\..\.."

echo =============================
echo Compiling libzip...
echo =============================
cd "%libzip%"
mkdir "build"
cd "build"
cmake ".." -A x64 -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX="%root%/lib/install" -DCMAKE_PREFIX_PATH="%root%/lib/install" -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=ON -DBUILD_TOOLS=OFF -DBUILD_REGRESS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOC=OFF
if %ERRORLEVEL% GEQ 1 goto error_libzip
cmake --build . --config Debug --target install
if %ERRORLEVEL% GEQ 1 goto error_libzip
cmake --build . --config Release --target install
if %ERRORLEVEL% GEQ 1 goto error_libzip
echo "OK" > ".compiled"
cd "..\..\.."

:compile_libzippp
rmdir /q /s "dist"
mkdir "dist"
cd "dist"
mkdir "release"
copy "..\%zlib%\build\Release\zlib.dll" release
copy "..\%libzip%\build\lib\Release\zip.dll" release
copy "..\src\libzippp.h" release

mkdir "debug"
copy "..\%zlib%\build\Debug\zlibd.dll" debug
copy "..\%libzip%\build\lib\Debug\zip.dll" debug
copy "..\src\libzippp.h" debug
cd ".."

echo =============================
echo Compiling (shared) lizippp...
echo =============================
rmdir /q /s "build"
mkdir "build"
cd "build"
cmake .. -A x64 -DCMAKE_PREFIX_PATH="%root%/lib/install" -DBUILD_SHARED_LIBS=ON
if %ERRORLEVEL% GEQ 1 goto error_libzippp
cd ".."
cmake --build build --config Debug
if %ERRORLEVEL% GEQ 1 goto error_libzippp
cmake --build build --config Release
if %ERRORLEVEL% GEQ 1 goto error_libzippp

copy "build\Release\libzippp_shared_test.exe" "dist/release"
copy "build\Release\libzippp.dll" "dist/release"
copy "build\Release\libzippp.lib" "dist/release"
copy "build\Debug\libzippp_shared_test.exe" "dist/debug"
copy "build\Debug\libzippp.dll" "dist/debug"
copy "build\Debug\libzippp.lib" "dist/debug"

echo =============================
echo Compiling (static) lizippp...
echo =============================
rmdir /q /s "build"
mkdir "build"
cd "build"
cmake .. -A x64 -DCMAKE_PREFIX_PATH="%root%/lib/install" -DBUILD_SHARED_LIBS=OFF
if %ERRORLEVEL% GEQ 1 goto error_libzippp
cd ".."
cmake --build build --config Debug
if %ERRORLEVEL% GEQ 1 goto error_libzippp
cmake --build build --config Release
if %ERRORLEVEL% GEQ 1 goto error_libzippp

copy "build\Release\libzippp_static_test.exe" "dist/release"
copy "build\Release\libzippp_static.lib" "dist/release"
copy "build\Debug\libzippp_static_test.exe" "dist/debug"
copy "build\Debug\libzippp_static.lib" "dist/debug"

goto end

:error_zlib_not_found
echo [ERROR] The path was not found: %zlib%.
echo         You have to download zlib 1.2.13 and put in the folder %zlib%.
goto end

:error_zlib
echo [ERROR] Unable to compile zlib
goto end

:error_libzip_not_found
echo [ERROR] The path was not found: %libzip%.
echo         You have to download libzip 1.10.0 and put it in the folder %libzip%.
goto end

:error_libzip
echo [ERROR] Unable to compile libzip
goto end

:error_vs2012_not_found
echo [ERROR] VS2012 was not found (path not found: %vs2012devprompt%).
goto end

:error_libzippp
echo [ERROR] Unable to compile libzippp
goto end

:end
cd "%root%"
cmd

이걸로 다시 빌드해본 static lib 파일들과 소스코드를 들고와서 실행해보자

 

static lib 및 소드코드 가져오기

이렇게 가져오고 실행시켜보자

 

헤더와 lib를 추가했는데 왜 에러가 나지

 

lib 폴더를 추가 라이브러리 디렉터리에 포함하지 않고 있었다

넣었는데도 에러가 난다

 

헤더와 이번에는 cpp 파일까지 넣어보자

 

알고보니 libzippp 헤더 경로를 잘못 작성해서 그런 거였다

고쳐주니 밑줄은 모두 사라졌다

 

libzippp.cpp에서도 zip.h 경로를 못찾길래 프로젝트 경로로 헤더들을 모두 옳기니 빌드 성공했다

 

실행은 되는데 zip 파일이 안생긴다...

 

library 소스 파일 다 넣기

이왕 이렇게 된거 모든 소스 파일을 다 넣자

 

zlib의 소스 파일

 

libzip > lib 의 소스파일들

 

libzip > src 의 소스 파일들

 

겹치는 것은 CMakeLists.txt 밖에 없고 이미 빌드를 한 상태에서는 필요가 없다

 

모든 소스 파일을 넣고 테스트

일단 빌드는 당연히 되는 상태에서 실행은 시켜봤으나..

 

아쉽게도 함수는 실행이 되어도 zip 파일을 생기지 않는다

여태까지 libzippp의 zip 파일 open을 어떤 방법으로도 성공시키지 못했다

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유