FreePascal と D でいちゃいちゃする
おけましておめでとうございました。
今年もよろしくお願いします。
最近は専ら FreePascal/Lazarus でしかプログラミングしてないのだけど
久し振りに D言語 も触りたいなと思った所で
何か良いネタは無いか…と探した所、ありました良いネタ。
Lazarus は Delphi のマルチプラットフォーム版みたいなやつで、
フォームデザインなんかはマウスでぽちぽち出来たりします。
是非 D言語 でもそれを使いたい。
因みに Lazarus で使用されるコンポーネント群は LCL(Lazarus Component Library) と
呼ばれているのですが、マウスでポトペタは無理にしても、
せめて使い慣れたそれらを D言語 から使えたら…
という事で、それを実現するにはどうすれば良いかと。
取り敢えず定石として、LCL を shared library に纏めて D言語 から呼べるようにしたい。
幸い、FreePascal も D言語 も、C言語と親和性が高いので、どうにかなるんじゃね?
という事なのだが、そこら辺のノウハウが全く無いので
まず最初の一歩として
FreePascal で shared library の作成
と
D言語 からそれの呼び出し
だけやってみた。
・まず FreePascal 側で shared library を作る。
hoge.pas
library hoge; {$mode objfpc}{$H+} uses Classes { you can add units after this }, sysutils; var input1, input2 : Integer; procedure SetData( i1, i2 : Integer ); cdecl; begin input1:=i1; input2:=i2; end; function Calc:Integer; cdecl; begin Result := input1+input2; end; exports SetData, Calc; begin end.
コンパイルする。
$ fpc hoge.pas →libhoge.so
・D言語から libhoge.so を呼んでみる。
main.d
import std.stdio; extern (C) { void SetData( int i1, int i2 ); int Calc(); } void main( string[] args ) { SetData( 100, 10 ); writeln( Calc() ); writeln("hoge!"); return; }
コンパイルする。
$ dmd main.d -Llibhoge.so
LD_LIBRARY_PATH に libhoge.so がある場所を教えておく。
$ export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:
実行する。
$ ./main 110 hoge!
出来た!嬉しい!
最初 cdecl を stdcall にしてて、
./main 実行した最後に SIGSEGV 吐かれて参ったりしてた。
とりあえず一歩前進。
ちくちくラッパー書いていこうかな。
あと僕も MBA 11inch 欲しいので。
MacBook Air 11インチ欲しい!
これで 去年の人 も卒業出来ました:-)