소개 및 준비

admin의 아바타


C언와 Tcl의 연결

지금이야 말로 GUI의 전성시대입니다. DOS 프롬프트나, 유닉스 셸의 커맨드 라인으로부터 커맨드를 실행시키는 문자베이스(CUI)는 특히나 초보자에게는 낯설게 보이고 있습니다. 지금은 윈도우 어플리케이션이 표준이 되어있고, 세상의 모든 프로그래머는 모름지기 상용 프로그램으로 내놓기 위해서는 이러한 비쥬얼 인터페이스 프로그램을 만들지 않으면 어렵다고 느끼고 있습니다. Tcl/Tk를 사용한다면 간단하게 GUI를 제작할수 있다는것을 시어머니도 알 만큼 [Tcl/Tk 소개]편 에서 소개를 했었습니다. 혹시 자신이 만들어 놓은 C언어 인터페이스를 Tcl과 붙일수 있다고 생각한적이 있나요? 예를 들어, 속도나 기능은 아무래도 C언어로 쓰지 않으면 안되는 복잡한 계산이나, 시뮬레이션등의 프로그램에 Tcl/Tk의 GUI를 붙이고, 사용자가 뭔가 입력한 내용을 C언어로 처리하는 것입니다. 이것은 GUI와 API의 완전 분리측면에서 아주 고마운 방법입니다.

혼합 프로그래밍시 두가지 스타일

C언어로부터 Tcl의 라이브러리를 사용하는 방법은 크게 두가지로 나눕니다. 첫번째는 원래의 Tcl/Tk 처리계에 자신만의 커맨드를 추가하여 확장하고, 기능을 강화한 tclsh나 wish를 만드는것입니다. 이것은 특히, Tcl언어로는 너무 늦고 사용할수 없는 처리,Tcl언어로는 지원할수 없는 기능을 C언어로 쓰고, 그 처리를 Tcl로부터 호출할때에 사용합니다. 이 방법은 확장(extension)이라 불리고, 이 또한 두가지 방식으로 나뉩니다. 첫번째는 원래의 tclsh나 wish 소스코드의 main함수를 만져 기능을 추가합니다. 두번째는 자신만의 독창적인 Tcl커맨드를 썻던 C프로그램을 공유라이브러리(dll 이나 so)로 컴파일하여, 표준 tclsh나 wish의 load 커맨드, 또는 package require 커맨드로 로드할수 있는 방법이 있습니다. 두번째 공유라이브러리를 만드는 쪽이 편리하기 때문에 이번 주제의 글에서는 이 두번째 방법에 치우쳐 설명하도록 하겠습니다. 두번째 방법은 자신이 이미 만들고 있는 C프로그램에 Tcl커맨드를 해석 실행하는 기능을 붙이는 것입니다. 이것은 특히, 자신의 C프로그램에 Tcl/Tk의 Tk커맨드를 사용한 GUI화면을 붙이는 목적으로 쓰여지고 있는것이 대부분입니다. 이번엔 필요한 준비물(?)에 대해서 알아보도록 하겠습니다.

  • 만들려고 하는것이 이미 누가 만들었지 않는가?
  • C와 Tcl의 관계는 어떻게 할건가?
  • Tcl/Tk의 라이브러리/헤더는 설치하였는가? 또 그것이 어디에 있는지 알고 있는가?
  • C언어 컴파일러는 있는가?

이미 만들어져 있는가?

Tcl/Tk 커뮤니티 힘은 대단합니다. 뭔가 만들고 싶은것이있고, 또 그것이 범용성이 있는 기능이라면 반드시 누군가가 만들어 배포하고 있을겁니다. 먼저 조사를 해보고, 발견되지 않았다면 확장을 시도해봅니다. 여담입니다만 이렇게 배포되고 있는 소스코드를 보는것은 매우 좋은 공부가 됩니다.

C와 Tcl의 관계

앞의 글에서 C와 Tcl을 링크하는 이유는,

  • C언어로부터 Tcl언어의 해석기능이나, Tcl/Tk API함수를 사용한다.
  • 독자적인 Tcl/Tk 커맨드를 C언어로 작성하고, Tcl/Tk 인터프리터를 확장한다.

위의 두가지 이유입니다. 이것은 수요자게 따라 다르며 어느것이 좋다,나쁘다 말할수는 없습니다. 한가지 방식을 알면, 곧바로 다른 한쪽방식도 사용할수 있습니다. 또 후자의 Tcl/Tk처리계를 확장하는 방법은, 또한

  • 독자적인 Tcl/Tk 인터프리터를 확장한 tclsh나 wish를 만든다.
  • load커맨드를 사용할수 있는 공유 라이브러리를 만든다.

의 두가지를 나누어집니다. 간단하게 말씀드리면 EXE를 만들지, DLL을 만들까 하는 것으로 현재는 후자의 방법이 보통으로 쓰입니다.

Tcl/Tk 헤더(header)와 라이브러리(library)

먼저 Tcl/Tk가 설치된 디렉토리를 볼필요가 있습니다. 보통 윈도우에 설치를 하셨다면 c:\tcl 이지만, 따로 디렉토리를 지정하셨다면 설치된 디렉토리를 알고계실겁니다. 유닉스의 경우는 따로 configure 할시 –prefix 로 디렉토리를 지정하지 않으셨다면 보통 실치된 디렉토리가 /usr/local 입니다. 자 이제 헤더와 라이브러리가 있는지 확인을 해봐야 합니다. 먼저 헤더를 확인해보겠습니다. Tcl/Tk가 설치된 디렉토리 밑에 include디렉토리 안에 tcl.h, tk.h가 있는지 확인합니다. 다음 lib라는 디렉토리에 가서 tcl84.lib, tk84.lib, tclstub84.lib, tkstub84.lib 라이브러리 파일이 있는지 확인합니다. 유닉스 사용자라면 libtcl8.4.a(또는.so, .sl 이하도 같은파일입니다.), libtk8.4.a, libtclstub8.4.a, libtkstub8.4.a 파일이 있는지 확인합니다. 위에서 언급한 파일이 모두 있다면 정상적으로 설치된것입니다.

C언어와 컴파일러

보통 많이 쓰이는 씨언어 컴파일러는 아래와 같습니다.

  • 마이크로 소프트 - Visual C++(VC++)
  • 볼랜드 - Borland C++(BC++)
  • 오픈소스 - MinGW(Minimalist GNU for Win32)
  • 레드햇 - Cygwin의 gcc

참고로 볼랜드사에서 공개용 컴파일러 Borland C++ 을 제공하고 있습니다. 컴파일러는 http://borland.co.kr/products/downloads/download_cbuilder.html 에서 받으실수 있습니다.