티스토리 뷰

 

https://www.youtube.com/watch?v=XuWjcX8KaVQ 

 

 

1. 시작 전 세팅

 - 설명의 편의를 위해 home 폴더를 기준으로 작성합니다.

cd ~
pwd
# 현재 경로 : /root

 

1-1. wget 설치

 - http 로 라이브러리 파일을 다운받기 위한 도구입니다.

yum install wget

 

* Centos8 에서 아래와 같은 에러가 나는 경우 이동 (부록 1)

Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: NoURLs in mirrrlist

 

1-2 폴더구조

 - 라이브러리 빌드를 위한 폴더 구조입니다.

[root] mkdir libpng_build
[root] cd libpng_build

 

 - libpng, zlib 설치

[libpng_build] wget https://sourceforge.net/projects/libpng/files/libpng16/1.6.38/libpng-1.6.38.tar.gz
[libpng_build] wget https://sourceforge.net/projects/libpng/files/zlib/1.2.7/zlib-1.2.7.tar.gz

 - 다운로드를 완료하면 ls 명령어로 잘 다운됐는지 확인 할 수 있습니다.

 - 압축을 풀어줍시다.

# 압축 풀기
[libpng_build] tar -xvf libpng-1.6.38.tar.gz
[libpng_build] tar -xvf zlib-1.2.7.tar.gz

# 압축 푼 파일 제거
[libpng_build] rm -rf libpng-1.6.38.tar.gz
[libpng_build] rm -rf zlib-1.2.7.tar.gz

# 디렉토리 이름 변경
[libpng_build] mv libpng-1.6.38/ libpng
[libpng_build] mv zlib-1.2.7/ zlib

 

zlib 을 1.2.7 로 받은 이유 (부록 2)

 

2. 빌드

2-1. libpng_build 에 CMakeLists.txt 추가합니다.

[libpng_build] vi CMakeLists.txt

# CMakeLists.txt 내용
project(libpng_build)
cmake_minimum_required(VERSION 3.17)

add_subdirectory(zlib)
add_subdirectory(libpng)

2-2. 빌드하기

 - cmake 설치합니다.

yum install cmake3
yum install gcc gcc-c++

 

 - build 폴더 추가합니다.

[libpng_build] mkdir build
[libpng_build] cd build

 - cmake 로 Makefile 을 생성합니다.

[build] cmake \
-DPNG_BUILD_ZLIB=ON \
-DZLIB_INCLUDE_DIR=/root/libpng_build/build/zlib \
-DZLIB_INCLUDE_DIRS=/root/libpng_build/build/zlib \
-DZLIB_LIBRARIES=/root/libpng_build/build/zlib/libz.a \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
..

 - 빌드하기 위해 sub directory 의 파일 복사합니다.

[build] cp ../zlib/*.h zlib/

 - make 명령으로 빌드를 시작합니다.

 

[build] make

 

3. 테스트

 - 샘플 프로젝트를 구성합니다. 

cd ~
mkdir libpng_test
cd libpng_test
mkdir test
mkdir include
mkdir lib

 

 - 테스트 코드를 작성합니다.

// test/main.cpp

#include <iostream>
#include <cstdio>
#include <png.h>

int main()
{
	FILE* m_file;
	m_file = fopen( "/root/libpng_test/sample.png", "rb" );
	if ( !m_file )
	{
		std::cout << "fail open\n";
		return 0;
	}

	png_structp pngPtr = nullptr;
	png_infop   infoPtr = nullptr;

	pngPtr = png_create_read_struct( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL );
	if ( pngPtr == NULL ) return 0;

	infoPtr = png_create_info_struct( pngPtr );
	if ( infoPtr == NULL || setjmp( png_jmpbuf( pngPtr ) ) )
	{
		png_destroy_read_struct( &pngPtr, &infoPtr, NULL );
		return 0;
	}

	png_init_io( pngPtr, m_file );
	int sigRead = 0;
	png_set_sig_bytes( pngPtr, sigRead );

	png_read_png( pngPtr, infoPtr, PNG_TRANSFORM_EXPAND, NULL );

	return 0;
}
# test/CMakeLists.txt

project( Test )

FILE( GLOB_RECURSE SRCS ./*.* )

include_directories(
        "../include"
)

link_directories(
        "${CMAKE_SOURCE_DIR}/lib"
)

add_executable( Test ${SRCS} )

target_link_libraries(
        Test
        png
        z
)
# CMakeLists.txt

project( Lingpng_Test )

add_subdirectory( test )

 - 위에서 사용했던 헤더파일과 라이브러리를 복사합니다

[libpng_test] cp ../libpng_build/libpng/*.h include/
[libpng_test] cp ../libpng_build/build/libpng/*.h include/
[libpng_test] cp ../libpng_build/build/libpng/libpng.a lib/
[libpng_test] cp ../libpng_build/build/zlib/libz.a lib

 - 위 test/main.cpp 에서 png 파일을 읽는 부분에 정의한 png 파일을 추가합니다.

 - 테스트코드에서는 빌드 여부를 보기 위함으로 파일이 없어도 상관 없습니다.

 

 - 테스트 프로젝트를 빌드합니다.

[libpng_test] mkdir build
[libpng_test] cd build
[build] cmake ..
[build] make

 - 빌드를 성공적으로 마쳤다면 test 폴더안에 바이너리 파일이 추가됩니다.

 - 이상으로 libpng 빌드 정리를 마칩니다.

 

 

부록

1. Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: NoURLs in mirrrlist 에러시 처리

To migrate from CentOS 8 to CentOS Stream 8, run the following commands:

dnf --disablerepo '*' --enablerepo=extras swap centos-linux-repos centos-stream-repos
dnf distro-sync

2. zlib 을 1.2.7 로 받은 이유

위 과정을 마친후 libpng_test/include/pnglibconf.h 를 보면 ZLIB_VERSION 이 설정되어있습니다.

libpng 라이브러리를 빌드할때 맞는 ZLIB 을 사용해야 하기 때문에 1.2.7 버전을 사용하였습니다.

확인은 다음과 같이 할 수 있습니다.

cat /root/libpng_build/build/libpng/pnglibconf.h | grep ZLIB
#define PNG_ZLIB_VERNUM 0x1270
댓글