본문 바로가기

운동하는 개발자/c++

cmake를 이용한 zlib 연동기 ( "dll이(가) 없어 코드 실행을 진행할 수 없습니다.")

728x90

아직도 윈도우 라이브러리에 대해 명확히 알지 못하고 있던 자신을 반성하며

압축 해제를 위해서 무료이며 가장 범용적인 zlib 라이브러리를 가져다 쓰기로 했다

http://www.zlib.net/

 

zlib Home Site

<!-- H4 ALIGN="center" IMG WIDTH=42 HEIGHT=44 ALIGN="middle" SRC="images/happyicon.png" ALT="[happy face, because it's so darned useful!]" /H4 --> A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by

www.zlib.net

리눅스, 윈도우 모두 사용 가능 하기에 크로스컴파일 상황에서 딱 맞았다

가장 최신소스를 내려받아서 visual studio 2022로 열어 빌드하였다(CMakefile 사용)
out폴더 경로엔 lib파일 h파일 dll파일 모두 생성이 되었다
(wsl을 이용하여 우분투에서도 빌드해 본 결과 so파일과 a파일이 정상적으로 생성)

나는 정적라이브러리를 사용할 계획이었기에 해더 파일과 lib파일을 복사했고 cmake에서 링크하기 위해 애썼다

결과적으로 링크 한 CMakeList.txt (디버깅 모드로 빌드했기에 이름뒤에 d가 붙어있다)

target_link_directories([프로젝트명]
	PRIVATE
	${CMAKE_SOURCE_DIR}/external/zlib
)


target_link_libraries([프로젝트명] 
 	PRIVATE
 	zlibd
 )

external/zlib경로에는 zlib.h와 zlibd.lib 파일 존재

많은 구글링으로 다른 CMake와 비교해보며 다 잡아줬는데 최종적으로 분명 파일은 찾아서 링크하는 거 같은데 막상 해당 lib를 포함시킨 exe를 실행 시 에러가 발생했다 

zlib.dll이(가) 없어 코드 실행을 진행할 수 없습니다. 프로그램을 다시 설치하면 이 문제가 해결될 수 있습니다.

환장할 노릇이였다 LIB파일을 분명 확장자도 붙여서 호출했는데 왜 DLL을 찾는지..?

알고 보니 이 LIB는 동적(공유) 라이브러리 빌드시 생성된 파일이고 DLL을 호출할 때 묵시적링크(Implicit Linking)에 사용되는 파일이란 걸 알게 되었다...
부라 부랴 zlib의 cmakefile을 까 봤다

zlibstatic이란 이름으로 정적 라이브러리도 함께 빌드하게 되어있었고 폴더를 열어보니..

zlibstaticd.lib이란 파일이 있었다 (이걸 두고 저 위에 zlibd.lib를 가져가서 링크하고 쑈한것...)

파일만 갈아 끼웠고 CMake 쪽에서 잘못한 줄 알고 이것저것 넣었던 것들을 살짝 정리해주니 바로 잘 동작했다

조만간 라이브러리에 대해 다시 한번 정리해서 포스팅해야겠다

728x90