오늘 아침에 GeoIP라는 라이브러를 이용해서 도메인에 대한 IP 지역정보를 뽑아볼 일이 있었다.
이거 Python 바인딩이 있고, 그냥 C로 만들면 바로 구동해 볼 수 있었는데 걍 D로 바인딩 하는 작업을 해서 해봤다. 사실 D로 해보고자 했던 가장 중요한 이유는 GeoIP.h파일이 너무 간단하게 되어 있어서 이걸 D헤더(?)로 변환하는 작업이 거의 필요 없었기 때문이다.
사실 이 작업만 하면 D를 이용해서 C로 구현된 라이브러리를 가져와 쓰는것은 일도 아니다.
간단하게 이 룰에 따른 헤더 변환 작업만 해주면 된다.
그러나 나는 몇가지 호출해서 쓸 함수만 간단하게 D파일에서 “extern (C)”로 선언해주고 사용했다.
사실 htod라는 툴을 이용하면 쓸데없는 군더더기가 붙지만 h파일을 D파일로 일괄 변환해 준다.
이렇게 변환된 GeoIP 라이브러리용 D파일은 아래와 같다.
파일을 보면 주석 처리가 되어 있는 부분이 실제 h파일에 적혀 있던 내용이고 그 h파일을 d로 선언해주는 부분은 주석 바로 아래에 나타난다. 주석과 실제 D코드를 보면 상당히 유사하지만 재밋는 차이점들을 발견할 수 있다.
아래와 같이 실행해주면 바로 컴파일 가능하다.(ubuntu linux 머신에서 컴파일 했다. )
> dmd testGeo.d GeoIPlib.d -L-lGeoIP
gcc testGeo.o GeoIPlib.o -o testGeo -m32 -lGeoIP -lphobos -lpthread -lm
-L옵션은 libGeoIP.a 파일을 링킹 해주기 위해 gcc 인자로 옵션을 넘기기 위한 옵션이다. (‘libGeoIP.a’파일은 GeoIP사이트에서 직접 소스를 받아 make하면 얻을 수 있다. )
여기서 testGeo.d파일은 아래와 같은 파일이다.
[CODE c]
import GeoIPlib;
import std.c.stdio;
import std.string;
void main(char[][] argv){
GeoIP *gi;
gi = GeoIP_new(GEOIP_STANDARD);
printf(“code of %s\n”, GeoIP_country_code_by_name(gi, “kr.yahoo.com”));
GeoIP_delete(gi);
}
[/CODE]
실행하면 “code of KR”이란 결과가 나온다.
실제 C로 라이브러리를 사용하는 예제랑 외형이 거의 흡사하다.
D 언어에서 lib호출해서 쓰기 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.