3D 프린팅을 하기 위한 파일 형식 중 CAD와 같은 툴에서는 3MF라는 형식을 사용한다. C++프로젝트에서 3MF 파일로 export 하는 방법에 대해서 알아보도록 한다.
3MF로 export 하는 방법
3MF는 다른 파일형식과는 다르게 export할 때 일반적인 C++ 내장 파일 입출력으로는 export 하지 못한다. 그래서 zip과 같은 압축형태로 3MF를 생성해서 출력해야하는데. 이를 위한 zip 기반 라이브러리로 libzip을 보통 사용한다.
libzip소스는 C언어 기반 라이브러리이기 때문에 C++에서 사용하기 위해서는 C기반 라이브러리에서 warping된 버전이 필요하다. 따라서 아래 링크에 보이는 libzip의 C++ 버전 libzippp를 사용하기로 해본다.
libzippp를 받고, 라이브러리를 프로젝트에서 사용할 수 있도록 세팅 해보도록 한다.
조건
해당 프로젝트는 하드웨어 기기 위에서 돌아가기 때문에, 조건이 있다.
동적 외부 라이브러리인 dll 파일을 넣지 않고 오로지 소스를 lib 형태로 가져와서 정적 외부 라이브러리 형태로 넣는 것이다.
그 이유는 dll의 경우 runtime에 참고하도록 설정되어있는데, 하드웨어 기기 위에서 돌아가려면 라이브러리가 lib 형태로 compile 단계에서 적용이 완료되어야 하는 것이 조건이다.
libzippp 라이브러리 및 코드만 넣고 빌드
위 함수들이 libzippp에서 사용하는 함수들의 일부이다. libzippp.lib 파일을 라이브러리로 하나만 넣어서 코드를 작성하였는데 다음과 같이 LINK에러가 발생한다.
라이브러리 환경 세팅이 잘못된 것이다. 해결하러 가자.
libzippp 환경 세팅 시작하기
라이브러리의 메뉴얼을 참고하여 세팅을 해보자.
우선 필요한 필수 라이브러리는 Zlib과 libzip이 필요하다. libzippp하나만으로는 구동하지 않고 libzip 라이브러리에 의존하는 부분이 있는 모양.
설치해야 하는 것
윈도우 기준으로 libzippp-<version>-windows-ready_to_compile.zip. 해당 파일이 필요하다.
release에 보면 있는데 다운받아주자.
파일을 받은 후 CMake를 통해서 컴파일 해준다.
컴파일 하기
다운 받은 파일 압축을 풀고 cmake를 이용해서 libzippp 컴파일을 시도한다.
컴파일 시도시 zlib가 없다는 에러가 발생한다.
libzip github에서 libzip을 빌드할 때 zlib가 필요한 것으로 보아 의존 순서가 zlib > libzip > libzippp 인 듯 하다.
그럼 먼저 zlib를 설치해보자.
zlib 설치하기
사이트에서 recent release를 받는다.
tar -zxvf zlib.tar.gz -C ./
파일은 tar.gz이므로 압축을 풀어준다.
이제 압축을 풀어 만든 zlib 폴더를 cmake로 generate 한다.
build된 폴더에는 딱히 lib 관련된 소스가 없는데. 다른 방법을 찾아보자.
윈도우 대안책
더 쉬운 다른 방법이 있는 모양이다.
zlib, libzip, libzippp 셋 다 소스를 받고, CMake로 build 하는 방법이다.
여기서 MSVC는 그냥 visual studio를 켜서 컴파일하는 방법을 말한다.
위에서 zlib을 빌드하고 컴파일 했었는데,
사실 libzippp-v7.1-1.10.1-windows-ready_to_compile 파일에 lib 폴더에 다 준비되어있었다.
하나하나 cmake로 빌드해주자.
libzippp 라이브러리 빌드
zlib와 libzip 모두 빌드.
lib 폴더에 zlib가 1.3버전과 1.3.1 버전 둘 다 있었는데 혹시 몰라서 둘 다 빌드했다.
libzip은 zlib을 필요로 하기 때문에 zlib을 먼저 빌드 해주어야 libzip이 빌드 될 것이다.
libzip 빌드가 에러? could not find zlib이란다.
왜지? zlib 빌드 했는데. 어디있는지를 설정으로 알려주어야 하나보다.
add entry로 zlib 경로에 대한 option을 추가해주었다.
그래도 에러가 나네?
docs를 다시 읽어보면서 뭐가 잘못되었는지 보자.
준비된 환경 사용하기
위 내용을 읽어보면, libzippp-<version>-windows-ready_to_compile.zip에 있는 compile.bat을 실행하기만 하면 된다고 한다. 하나하나 빌드하는 것도 bat에서 다 해주는 건가?
빌드를 하지 않은 상태에서 시도하도록 세팅되어있는 모양이다.
위에서 생성한 빌드 파일들을 삭제하고 진행하면 잘 컴파일 된다.
새로운 dist 와 build를 생성하였다.
dist 경로의 release 파일을 보면 위와 같은데
해당 파일들은 github 소스의 releases에서 libzippp.bin.zip파일을 열었을 때의 구성과 똑같다. 파일 크기는 조금 다르지만.
새로운 lib 내 폴더
추가된 것 그뿐 아니라 lib 폴더에 install이라는 폴더가 추가되었다.
안에는 lib 폴더가 또 있고, 그 안에 zlib 라이브러리가 있다.
libzippp-v7.1-1.10.1-windows-ready_to_compile\build\Release
build 폴더 안에는 Release 폴더가 있는데 이 안에 lipzippp_static에 대한 라이브러리가 있다.
libzip에는 zipl.lib이라는 라이브러리가 있다. 알고보니 위에서 install폴더에 있던 zip.lib가 libzip의 라이브러리였던 것 같다.
각각의 라이브러리를 프로젝트에 넣어보자.
프로젝트에 라이브러리 넣기
libzip과 zlib의 라이브러리를 모두 넣고
libzippp-v7.1-1.10.1-windows-ready_to_compile\dist\release 위치에있는 libzippp의 라이브러리를 넣자.
빌드 실행
프로젝트 속성 > 추가 종속성 에서 모든 라이브러리를 종속으로 넣고 빌드해보니
드디어 빌드 성공이다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
Three.js TypeScript 시작 및 초기 세팅하기 (0) | 2024.05.09 |
---|---|
three.js에서 webgpu를 지원하나? (1) | 2024.05.04 |
WebGPU depth texture 깊이 뎁스 텍스처 (0) | 2024.05.02 |
ESRGAN 실행하기 super resolution 초해상도 오픈소스 github 코드 (0) | 2024.05.01 |
webgpu obj load 오브젝트 로딩 깨짐 늘어짐 문제 해결 fix vertex broken + blender decimate vertex face count 버텍스 줄이기 면 줄이기 + uint16 to uint32 (0) | 2024.04.30 |