Post

동적 라이브러리 (.so) build

목차


동적 라이브러리 (*.so) 파일 빌드 국룰

동적 라이브러리 파일이나 프로그램을 빌드하는 경우 보이는 규칙(암묵의 룰 같은 것)이 있다.

이를 숙지한다면 더 빠르게 빌드할 수 있고, 빌드가 안되는 경우에도 빠르게 원인을 찾을 수 있을 것이다.


사전준비

  • Makefile 사용이 가능해야 한다.
  • Cmake가 필요할 수도 있다
1
2
which make
which cmake

없으면 해당 두개부터 설치하고 오자. 아직 C/C++을 빌드할 준비가 되어있지 않은 환경이다.


꼭 빌드가 필요한가..? (패키지 매니저를 통해 설치하는 방법도 있다.)

꼭 특정한 버전의 라이브러리를 설치할 필요가 없다면 그냥 패키지 매니저를 통해 빌드하는 것을 권장한다.

Ubuntu, Debian

1
2
# Debian 계열 리눅스의 경우 대체로 lib(라이브러리명) lib(라이브러리명)-dev 형태로 패키지가 제공된다.
apt-get install -y libxml2 libxml2-dev
1
2
# RedHat 계열 리눅스의 경우 대체로 (라이브러리명) (라이브러리명)-devel 형태로 패키지가 제공된다.
yum install -y zlib zlib-devel

라이브러리명과 -dev, -devel의 차이

라이브러리명만 설치할 경우 해당 바이너리를 설치하는 것이고 -dev -devel (develop) 을 설치할 경우 해당 라이브러리를 빌드할 수 있는 헤더파일과 라이브러리 파일이 설치된다.

이것은 libpcre를 임의로 컴파일한 것이다.

만약 apt-get install libpcre 를 진행한다면 bin/ 디렉토리의 바이너리들만 설치될 것이고
apt-get install libpcre-dev 를 진행한다면 include/ 의 헤더파일과 lib/ 의 동적 라이브러리 파일들이 설치될 것이다.


빌드 방법

1. 소스 다운로드

소스를 다운로드 받아야 한다.

소스는 깃허브, 공식 홈페이지 또는 소스포지(sourceforge) 등에서 다운로드 받을 수 있다.
이때까지 빌드해 본 경험상 위 3개의 방법이 가장 많았다.

wget으로 다운로드 하자.
--no-check-certificate 옵션 안주면 인증서 에러가 나는 경우가 많으므로 왠만하면 붙이자.

1
wget --no-check-certificate (link)

zip 파일이면 unzip 하고 tar.gz (tgz) 파일이면 tar -zxvf 한다.


2. 빌드 옵션 설정

configure 또는 configure.sh 파일이 있을 경우

90% 확률로 실행 가능한 configure 또는 configure.sh 파일이 있을 것이다. \

자신이 특정한 옵션을 붙어야 한다면 해당 라이브러리의 문서를 참조하거나
--help 태그를 붙여 어떤 태그가 있는지 확인한다.

별도의 옵션을 붙이지 않을 것이라면 빌드 후 나온 결과물을 어디다가 설치할 것인지를 결정해야 한다.
99% 확률로 --prefix 옵션이 있으니 해당 옵션을 통해 설치할 디렉토리를 지정한다.

1
./configure --prefix=/usr/local/pcre-8.36

이렇게 실행하면 별 이상이 없는 경우 Makefile 파일이 생성된다.

CMakeList.txt 파일이 있을 경우

CMakeList.txt 을 수정하거나 (아마 해당 파일을 직접 수정해야 하는 일은 거의 없을 것이다.)
공식 문서를 참고하여 따로 옵션을 붙여야 한다.

아마 대체로 Options.txt 등 옵션을 따로 지정할 수 있는 파일이 있을 것이다.
이를 찾아보도록 하자.

prefix의 경우 빌드 후 cmake --install . --prefix <path> 를 통해 원하는 경로에 설치할 수 있다.

또는 CMakeCache.txt 파일을 찾아보고 CMAKE_INSTALL_PREFIX 를 찾아서 수정하거나
cmake 를 진행할 때 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/gd ./ 를 통해 옵션을 지정할 수 있다.

동적 라이브러리 파일을 빌드하는 데 cmake는 거의 사용하지 않을 것이다.

아무것도 없을 경우

만약 없다면 Makefile 파일을 직접 수정해야 한다.

Makefile 파일이 있는지 확인하고 없다면 공식 문서를 참조한다.
(대체로 소스를 잘못 받았거나 다른 스크립트를 실행해야 하는 경우가 많을 것이다.)
(또는 find . -name "*configure*" -type f 명령어를 통해 configure 파일이 다른 디렉토리에 짱박혀 있는지 확인해보자.)

Makefile 파일이 있다면 prefix 와 관련된 옵션을 찾아서 지정한다.
공식 문서를 참조하거나 make install 시 설치되는 경로를 확인하면서 지정하면 된다.


빌드 및 설치

아래 명령어로 빌드하고

1
make -j8

빌드가 완료되었다면 아래 명령어로 설치한다.

1
make install

etc

프로그램 빌드 시 라이브러리 파일을 참조시키는 방법

설치가 완료되면 대다수의 라이브러리들이 --prefix 옵션으로 지정한 경로에 설치가 된다.

만약 --prefix 옵션을 지정하지 않았다면 높은 확률로 /usr/local 에 설치가 된다.

해당 경로로 이동하여 확인해보면 include/lib/ 디렉토리가 존재한다.
include/ 디렉토리에는 헤더 파일들이, lib/ 디렉토리에는 라이브러리 파일들이 존재한다.

1
2
3
4
5
6
7
# ls -al /usr/local/pcre-8.36
drwxr-xr-x  6 root root 4.0K Jan 16 17:37 ./
drwxr-xr-x 11 root root 4.0K Jan 16 17:35 ../
drwxr-xr-x  2 root root 4.0K Jan 16 17:37 bin/
drwxr-xr-x  2 root root 4.0K Jan 16 17:37 include/
drwxr-xr-x  3 root root 4.0K Jan 16 17:37 lib/
drwxr-xr-x  4 root root 4.0K Jan 16 17:37 share/

라이브러리 경로를 직접 지정해줘야 하는 경우 3가지의 방법으로 나뉜다.

  1. prefix 옵션으로 지정한 경로를 입력해줘야 하는 경우
    • nginx 빌드 시 첫번째 방법으로 진행된다.
      1
      
       configure --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre-8.36
      
  2. prefix 옵션으로 지정한 경로 내 include/ lib/ 경로를 따로 지정해줘야 하는 경우

  3. 플래그까지 지정해줘야 하는 경우 (보통 이 경우는 없다.)

lib(라이브러리명).so 파일의 경우 gcc 플래그를 붙일 때 -l(라이브러리명) 으로 지정해주면 된다.
ex ) libpcre.so 파일이라면 -lpcre 플래그를 사용하면 된다.

This post is licensed under CC BY 4.0 by the author.