41. 프로그래밍 Part 2: 외부 라이브러리

게임 서버를 작성하기 위해서는 여러 가지 기능이 필요합니다. 또한, 퍼블리셔나 플랫폼 규약에 맞추기 위한 기능도 추가해야할 수 있습니다. 이를 위해서 외부 라이브러리를 연동해서 써야하는 경우가 생깁니다. 이런 경우, 다음과 같은 과정을 통해서 외부 라이브러리를 사용할 수 있습니다.

여기서는 예제로 sodium 이라는 암호화 라이브러리를 링크합니다.

41.1. 외부 라이브러리 설치

사용하려는 라이브러리를 설치합니다. 대개의 경우 Ubuntu 나 Centos 패키지로 라이브러리가 존재할 확률이 높습니다. 이처럼 해당 라이브러리 패키지가 존재하는 경우, OS 의 패키지 매니저 (Ubuntu 의 경우 apt, Centos 의 경우 yum) 을 쓰시는 것이 편리합니다.

Note

Ubuntu 나 Centos 의 경우, 라이브러리 파일을 포함하는 패키지와 헤더 파일까지 포함하는 패키지를 구분해서 제공하는 경우가 많습니다. 게임 서버가 일단 빌드 된 후에는 라이브러리 패키지만 있어도 되지만, 게임 서버를 빌드 하기 위해서는 (즉, 컴파일하기 위해서는) 헤더 파일 패키지까지 설치해야됩니다. 보통 Ubuntu 에서는 헤더 파일 패키지의 경우 -dev 라는 이름으로 끝나는 패키지로 존재하고, Centos 의 경우 -devel 이라는 이름으로 끝나는 패키지로 제공됩니다.

sodium 의 경우는 다음과 같습니다:

Ubuntu

$ sudo apt-get install libsodium-dev

CentOS

$ sudo yum install libsodium-devel

41.2. CMakeLists.txt 에 추가

funapi_initiator 로 생성된 소스 디렉터리에는,

  • CMakeLists.txt
  • src/CMakeLists.txt

이렇게 두 개의 빌드 설정 파일이 있습니다. 두 번째 파일인 src/CMakeLists.txt 를 수정해서 다음의 내용을 추가합니다. 자세한 내용은 코드 뒤에 계속 설명합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...

###############################################################################
# Inclusion after setting variables.
###############################################################################

set(CMAKE_MODULE_PATH "/usr/share/funapi/cmake")

include(Funapi-src)

###############################################################################
# 추가 라이브러리 링크하기 위한 섹션
###############################################################################
# libsodium 라이브러리를 찾아서 LIBSODIUM 에 저장한다.
find_library(
  LIBSODIUM
  NAMES libsodium.so
  HINTS /usr/lib /usr/lib64
  REQUIRED)

# 위의 LIBSODIUM 에 저장되어있는 경로를 링크 대상으로 추가한다.
target_link_libraries(${PROJECT_NAME} ${LIBSODIUM})

...

41.2.1. 라이브러리 찾기

cmake 의 find_library 를 이용해서 라이브러리를 찾습니다. 위에 사용된 find_library 의 인자에 대한 설명은 다음과 같습니다.

  • LIBSODIUM: 라이브러리 위치를 저장할 변수 이름입니다. 사용하기 적절한 이름을 선택합니다.
  • NAMES {라이브러리 파일 이름}: 라이브러리 파일의 실제 이름입니다. 정적 라이브러리라면 .so 가 아니라 .a 로 끝나는 파일을 지정합니다.
  • HINTS {라이브러리 디렉터리}: 라이브러리가 표준 경로가 아닌 다른 곳에 설치된 경우라면 해당 경로를 지정해야 합니다. 표준 경로에 설치된 경우 생략할 수 있습니다.
  • REQUIRED: 해당 라이브러리가 없으면 빌드가 실패하도록 설정합니다.

41.2.2. 라이브러리 링크하기

cmake 의 target_link_libraries 를 이용해서 해당 라이브러리를 실제로 링크합니다.

앞에서 지정한 이름 부분 (위의 예에서는 LIBSODIUM) 을 인자로 전달하면 링커가 링크할 때 해당 라이브러리를 추가합니다.

41.3. 서비스 환경에 배포

target_link_libraries 를 사용하고, 서버 관리 Part 3: 서버 패키징 에 설명된 대로 게임 서버를 패키징하면, 사용한 라이브러리에 대한 의존성이 자동으로 추가됩니다.

이제 .deb 나 .rpm 으로 생성된 게임 서버를 설치하게 되면, OS 에서 우리가 추가한 library 가 설치되어있는지를 확인하고, 만일 설치되어있지 않다면 오류 메시지를 내면서 게임 서버 패키지 설치를 거부합니다. 이를 통해 필요한 라이브러리가 누락된 것을 금새 알 수 있습니다.

이런 오류 메시지가 발생하는 경우, 외부 라이브러리 설치 에서 한 것처럼 필요한 라이브러리를 설치해주면 됩니다. 위에서 예로 든 libsodium 의 경우, 다음과 같이 라이브러리를 설치하실 수 있습니다.

Ubuntu

$ sudo apt-get install libsodium18

Note

Ubuntu 버전에 따라 18 대신 다른 숫자일 수 있습니다.

CentOS

$ sudo yum install libsodium

Tip

게임 서버 빌드를 마치고 이를 라이브 서버에 배포하는 상황이기 때문에 -dev-devel 같은 개발 패키지는 설치하지 않아도 됩니다.