본문 바로가기

C

[GLIB2] 개발 환경 구축

GLIB는 GTK+ 프로젝트의 일부분에서 UI를 제외한 부분이 독립적으로 떨어져 나온 라이브러리로 다양한 소프트웨어 라이브러리를 포함하고 있다. 많은 운영체제에 이미 포팅되어있어 크로스플랫폼을 지원하며 event loop, IO, 자료구조와 같은 다양한 소프트웨어 라이브 러리를 지원한다. 이를 이용하면 빠르게 프로그램 개발이 가능하다. 회사 임베디드 제품에 포팅하여 사용중에 있으며 개발 속도와 호환성이 뛰어나 다양한 제품에 적용중이다.

 

API documents :https://docs.gtk.org/glib/

 

GLib-2.0

Reference for GLib-2.0

docs.gtk.org

 

개발환경구성

최근 문서에는 meson 빌더를 이용하여 구성하는것을 추천하는 편이긴하나 나의 경우에는 호환성이 더 우선으로 하기 때문에 autotools를 이용하여 구성하는 것을 선호한다. 이 문서에서는 autotools를 사용하여 호환성을 확보하도록 한다. 여담으로 C 개발시에는 autotools나 meson, cmake와 같은 빌더를 반드시 한개 정도는 학습하도록 하자. 이거만 알아도 C의 개발이 어렵다는 생각이 많이 줄어들 것이다.

 

디렉토리 구조

.
├── Makefile.am
├── configure.ac
└── src
    ├── Makefile.am
    └── main.c

간략히 설명하면 configure.ac가 빌드에 필요한 정보를 설정하는 파일이고 Makefile.am은 프로그램을 빌드에 필요한 파일과 컴파일 방법을 지정하는 것이라고 생각하면 된다.

 

configure.ac

AC_INIT([glibexam], [1.0], [onurmark1@gmail.com])

AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([src/main.c])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AM_SILENT_RULES([yes])

AM_MAINTAINER_MODE

m4_ifdef([AM_PROG_AR], [AM_PROG_AR])

LT_INIT

AC_PROG_CC
AM_PROG_CC_C_O

# Checks for libraries.
GLIB_REQUIRED=2.38.0
AM_PATH_GLIB_2_0($GLIB_REQUIRED,,,gobject gmodule gio gio-unix)
if test "$GLIB_LIBS" = ""; then
  AC_MSG_ERROR(GLIB $GLIB_REQUIRED or later is required to build cbroker)
fi
GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_38"

GLIB_MAKEFILE='$(top_srcdir)/Makefile.glib'
AC_SUBST(GLIB_MAKEFILE)

GLIB_TESTS

AC_CONFIG_HEADERS([config.h])

AC_CONFIG_FILES([
  Makefile
  src/Makefile])
  
AC_OUTPUT

이 모든걸 한번에 이해하려고 하면 첫걸음이 무거워 질 수 있으니 간단히만 살펴보자. 프로그램의 이름과 버전 그리고 빌드에 필요한 GLIB 라이브러리를 지정하여. 출력 결과로 Makefile, src/Makefile을 생성하게 된다라고 보면 된다.

 

Makefile.am

SUBDIRS = src

ACLOCAL_AMFLAGS = -I m4

가장 상위에 있는 Makefile을 생성하는 룰이다. 매우 간단한 룰로 하위 폴더 src를 포함여 빌드하라는 의미이다.

 

src/Makefile.am

bin_PROGRAMS = glibexam

# Build titerm
glibexam_SOURCES = \
        main.c

glibexam_CFLAGS = \
        $(AM_CFLAGS) \
        $(GLIB_CFLAGS) \
        $(GIO_CFLAGS) \
        $(GOBJECT_CFLAGS)

glibexam_LDADD  = \
        $(GLIB_LIBS) \
        $(GIO_LIBS) \
        $(GOBJECT_LIBS)

바이너리 프로그램을 생성한다. 프로그램 이름은 glibexam이며 main.c를 소스로 하는 프로그램이다. 해당 프로그램 빌드시 GLIB의 헤더와 라이브러리를 참조하여 컴파일 및 링크 하도록 한다는 지시어이다. 해당 라이브러리는 앞서 configure.ac에서 참조하도록 되어 있으니 다시 살펴 보도록 하자.

 

src/main.c

#include <glib.h>

int main(int argc, char *argv[])
{
    g_print("Hello glib!\n");

    return 0;
}

간단히 화면에 "Hello glib!"를 출력하는 프로그램이다. 

 

이렇게 파일을 준비한 후 configure.ac가 있는 디렉토리에서 다음과 같은 명령으로 autotool들에게 빌드 프로그램을 생성하도록 명령한다.

autoreconf -i

autoconf, automake 와 같은 프로그램을 하나씩 불러 생성할 수도 있지만 autoreconf를 이용하면 손쉽게 한번에 구성이 가능하다.

~/Workspaces/devel/glibexam ❯ autoreconf -i                                                                                                                                                                    ubuntu@tifront-dev 10:49:58 AM
aclocal: warning: couldn't open directory 'm4': No such file or directory
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build-aux'.
libtoolize: copying file 'build-aux/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: copying file 'm4/libtool.m4'
libtoolize: copying file 'm4/ltoptions.m4'
libtoolize: copying file 'm4/ltsugar.m4'
libtoolize: copying file 'm4/ltversion.m4'
libtoolize: copying file 'm4/lt~obsolete.m4'
configure.ac:11: installing 'build-aux/ar-lib'
configure.ac:11: installing 'build-aux/compile'
configure.ac:13: installing 'build-aux/config.guess'
configure.ac:13: installing 'build-aux/config.sub'
configure.ac:6: installing 'build-aux/install-sh'
configure.ac:6: installing 'build-aux/missing'
src/Makefile.am: installing 'build-aux/depcomp'

위와 같이 출력이되며 빌드에 필요한 m4 매크로와 툴들이 설치된다. 이 빌드를 생성하는 작업은 소스파일을 추가하여 Makefile.am의 룰이 추가되거나 configure.ac에 라이브러리를 추가하는것과 같은 빌드가 변경될 때만 해주면 된다.

 

컴파일 및 실행

~/Workspaces/devel/glibexam ❯ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether make supports the include directive... yes (GNU style)
checking for gcc... gcc

.......

~/Workspaces/devel/glibexam ❯ make
make  all-recursive
make[1]: Entering directory '/home/ubuntu/Workspaces/devel/glibexam'
Making all in src
make[2]: Entering directory '/home/ubuntu/Workspaces/devel/glibexam/src'
  CC       glibexam-main.o
  CCLD     glibexam
make[2]: Leaving directory '/home/ubuntu/Workspaces/devel/glibexam/src'
make[2]: Entering directory '/home/ubuntu/Workspaces/devel/glibexam'
make[2]: Leaving directory '/home/ubuntu/Workspaces/devel/glibexam'
make[1]: Leaving directory '/home/ubuntu/Workspaces/devel/glibexam'
~/Workspaces/devel/glibexam ❯ ./src/glibexam
Hello glib!
~/Workspaces/devel/glibexam ❯

자 우리가 익숙하게 보았던 autotools 그대로 이다. ./configure 하고 make를 입력하면 컴파일이 된다.

 

다음 포스팅에서는 glib 라이브러리를 사용하여 프로그래밍하는 방법에 대해 포스팅 하도록 하겠다.