SWIG 란
SWIG 는 C나 C++ 과 다른 여러가지 언어들을 간단하게 연결시켜서 사용할 수 있도록 도와주는 언어이다. 즉 C나 C++ 로 만들어진 여러가지 코드들을 Perl, Python, Tcl, Ruby, Java 등에서 사용가능하도록 만들어 준다. 우리가 자주사용하는 스크립트 언어인 Perl, Python 은 매우 강력하지만 몇가지 단점들을 가지고 있다. source 코드가 공개된다는 점과, 실행 속도가 느리다는 점이다. 즉, 속도에 매우 민감한 효율적인 코드를 작성할 필요가 있을때 문제가 될 수 있다.
SWIG 를 이용하면 인터페이스 부분은 매우 빠르고 손쉽게 개발이 가능한 Perl, Python 등으로 개발을 하고 코드를 숨겨야 되거나 혹은 나은 성능을 필요로 하는 핵심 부분은 C 로 작성하도록 해서 서로 연결시키는 것이다. 이렇게 함으로써 개발속도 향상, 효율성, 코드 은닉의 효과를 볼 수 있다.
참고로 SWIG 가 지원하는 언어는 Perl, Python, Java, Guile, Ruby, Php, Tcl 등이 있다.
SWIG 를 이용한 C library 와 python 연동
SWIG 를 이용하면 C library 와 python 모듈 간의 연동이 굉장히 간단합니다. 아래 연동하기 위해 시험삼아 만들어본 간단한 예제를 확인해보도록 하겠습니다.
SWIG 설치
swig 가 없는 경우에는 하기 명령어로 swig 를 설치합니다.
sudo apt-get install swig
C 파일 구현
example.c 파일 생성합니다. 만들고자 하는 코어 로직을 구현해주시면 됩니다. 본 예제에서는 간단하게 현재 시간을 가져오는 함수와 나머지값을 구하는 함수를 추가했습니다.
#include <stdio.h>
#include <time.h>
double My_var = 3.0;
int my_mod(int x, int y) {
return (x%y);
}
char * get_time()
{
time_t tV;
time(&tV);
return ctime(&tV);
}
Interface 파일 생성
example.c 파일을 위한 interface 파일을 만들어보도록 하겠습니다. 이 파일은 swig 가 C함수를 다른 언어와 연결시키기 위한 정보파일을 만들기 위해서 사용됩니다.
%module example
%{
extern double My_var;
extern int my_mod(int x, int y);
extern char * get_time();
%}
extern double My_var;
extern int my_mod(int x, int y);
extern char * get_time();
Python 모듈 생성
이제 swig 명령을 이용하여 위에서 생성한 interface 파일로 python 모듈을 생성합니다. example.py 와 example_wrap.c 파일 두 개가 생성되는데 example_wrap.c 는 뒤에 C Library 를 생성할 때 함께 컴파일되어야 합니다.
swig -python example.i
C Library 생성
코어 로직이 포함된 example.c 파일과 python 과의 연동을 위한 자동 생성 파일 example_wrap.c 를 컴파일 하고 동적 Library 로 생성해줍니다.
gcc -c example.c example_wrap.c -fPIC -I/usr/include/python3.4m/
ld -shared example.o example_wrap.o -o _example.so
확인용 python 파일 생성
이제 C library 와 python 연동을 위한 준비 과정은 모두 끝났습니다. 확인을 위한 python 파일을 하나 생성해서 제대로 동작하는지 확인해보겠습니다.
import pprint
import example
mod = example.my_mod(7,3)
time = example.get_time()
print mod
print time
pprint.pprint(mod)
pprint.pprint(time)
실행결과 확인
7%3 의 나머지값인 "1" 과 현재 시간이 정상적으로 출력되는 것을 확인할 수 있습니다.
'프로그래밍 > 리눅스' 카테고리의 다른 글
[svn 오류] svn: E155009: Failed to run the WC DB work queue associated with (3) | 2021.01.05 |
---|---|
[ubuntu v14.04.1] MariaDB 설치 방법 (2) | 2020.12.23 |
[리눅스/Linux] 컴파일을 위한 Makefile 간단 예제 - 여러개의 파일 (4) | 2020.12.03 |
[프로그래밍] ASCII table, 아스키 코드표 (4) | 2020.12.03 |
[리눅스] 컴파일을 위한 Makefile - 간단 예제 simple example (1) | 2020.12.02 |
댓글