본문으로 바로가기

SWIG를 이용한 Tcl 확장

category 카테고리 없음 2024. 5. 13. 17:29

SWIG 란?

SWIG는 C나 C++ 혹은 Objective-C로 쓰인 프로그램을 Perl, Python, MATLAB, Guile 그리고 Tcl/Tk와 같은 스크립트 언어로 연결시키는 인터페이스 컴파일러입니다. C/C++ 헤더 파일의 선언부를 취해서 연결코드(glue code 또는 wrapper)를 생성하는 데 사용하여 스크립트 언어가 C/C++코드를 사용할 수 있게 해 줍니다. SWIG는 C/C++로의 연결 과정을 자동화한 것으로 스크립트 언어를 더욱 사용하기 쉽게 해 줍니다. SWIG를 이용함으로 여러분이 만든 C/C++프로그램은 거의 수정 없이 Perl, Python 그리고 Tcl/Tk와 같은 스크립트 언어에서 사용할 수 있는 모듈로 전환됩니다. SWIG로 할 수 있는 일은 다음과 같습니다.

  • 기존의 C프로그램을 사용하는 강력한 인터페이스 설계 프로토타잎(Prototype)과 응용 프로그램 개발을 단축시킨다.
  • 대화적 디버깅
  • GUI를 만든다 (예: Tk를 사용)
  • 스크립트를 이용한 C라이브러리와 프로그램의 파워풀한 테스트
  • 스크립트 언어를 위한 고성능의 C모듈을 제작
  • C언어가 사용하기가 쉬워진다. (꼭 C로 만들어야 할 부분만 만들고, 나머지는 스크립트 언어로 쉽게)

SWIG란 무엇인지, 그리고 SWIG의 특징에 대해서 알아보았으니, 실습을 해보도록 합니다. 여기서는 Borland C++ 컴파일러를 사용하도록 합니다.

SWIG 최신버전 다운 및 설치하기

최신버전은 http://www.swig.org 에 방문해서 다운을 받거나 첨부파일로 올려놓은 현재 윈도우용 최신버전을 다운로드하시면 됩니다. SWIG는 따로 인스톨러가 없고 단순히 zip으로 압축되어 있기 때문에, 다운을 받고 압축을 풀면 그만입니다. 압축을 푼 후 swig 바이너리 파일인 swig.exe의 위치를 패스로 잡아줍니다. 저의 경우는 F:\swig-1.3.19을 패스로 잡아줬습니다.

패스가 제대로 잡혔는지 보기위해 swig -help라 입력해 봅니다.

C코드 파일 및 SWIG인터페이스 파일의 작성

본격적으로 Borland C++ 컴파일러를 사용해서 C API를 Tcl에서 불러오는 방법에 대해서 알아보도록 하겠습니다. 우선 아래와 같은 코드를 작성합니다.

ini.c

#include <windows.h>
void writeini(char* section, char* key, char* value, char* inifile)
{
        WritePrivateProfileString(section, key, value, inifile);
}

ini.i

%module ini
extern void writeini(char* section, char* key, char* value, char* inifile);


ini.c 코드는 Windows의 *.ini 파일을 취급하는 API인 WritePrivateProfileString의 래퍼(Wrapper)를 작성한 것이며, ini.i는 모듈명으로 Tcl로부터 이용할 수 있도록 하기 위해 작성한 것입니다.

SWIG로 래퍼(Wrapper)되는 C코드 생성

이제 다음과 같이 SWIG에 ini.i를 넣어주면 C와 Tcl의 연결이 되는 부분의 C코드를 생성해 줍니다.

F:\swig-1.3.19\test>swig -tcl ini.i

실행이 끝나면 ini_wrap.c 파일이 생성되어 있을 것입니다.

원시 C코드와 SWIG가 생성한 래퍼(Wrapper) 코드 컴파일

Tcl을 설치했을 때 Tcl의 bin디렉터리에 tcl84.dll 파일이 있는 것을 볼 수 있을 것입니다. 이제 이 dll파일을 볼랜드 C++ 컴파일러에서 사용가능한 라이브러리로 만들어서 사용할 것입니다.

F:\swig-1.3.19\test>implib -a tcl84_bcc.lib tcl84.dll


이제 생성된 라이브러리(tcl84_bcc.lib)를 사용해서 원시코드(ini.c)와 SWIG가 생성한 래퍼코드(ini_wrap.c)를 컴파일하여 DLL파일을 만들어봅니다. 먼저 tcl의 include디렉토리를 bcc32.cfg파일에 추가를 합니다.

F:\swig-1.3.19\test>bcc32 -tWD ini.c ini_wrap.c tcl84_bcc.lib


-tWD는 DLL을 만들기 위한 옵션으로 컴파일이 끝난 직후 ini.dll 파일을 생성됩니다. 이것으로 Tcl에서 C API를 호출할 확장모듈 제작이 끝난 것입니다.

완성된 확장모듈을 Tcl에서 이용하는 방법

제대로 확장모듈이 만들어졌는지 한번 시험해 보겠습니다.

load ini
writeini section key value .\\sample.ini

 

테스트가 끝나면 writeini에 의해 sample.ini파일이 생성되어 있을 것입니다.

[section] 
key=value