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インチ欲しい!


これで 去年の人 も卒業出来ました:-)