FreeBASIC で、静的ライブラリを生成する方法を示します。次に、コンパイラとして GCC を使って、C プログラムからそれを呼ぶ方法を示します。
注:GCC:GNU Compiler Collection。GNUプロジェクトによるフリーなコンパイラ。
この記事は、Windows を使うことで通しています。しかし、他のプラットホームの上の FreeBASIC への適用も、同様です。
このチュートリアルで:
簡単なテスト
この簡単なテストのために、FreeBASIC の静的ライブラリを生成します。これは、何も依存関係はありません。
これで、より簡単に始められるようになります。そして、基本が働いていることをチェックできます。
まず最初にライブラリが必要です。これは、ただ一つの些細な関数で、2つの整数を合計して、結果を返すだけのものです。
手続きの定義で、
cdecl と
Alias を使うことに、注意してください。
デフォルトで、C は、
cdecl 呼び出し規則を、使います。
FreeBASIC 宣言に
alias を使うと、FreeBASIC と C の、大文字小文字の区分の適合は、より簡単になります。
C は、大文字と小文字を区別します。FreeBASIC は、区分しません。
'' mylib1.bas
Function Add2Numbers cdecl Alias "Add2Numbers" _
( _
ByVal x As Integer, _
ByVal y As Integer _
) As Integer
Return x + y
End Function
上の内容の
mylib1.bas という名前のファイルを作ってください。そして、これを、下のようにコンパイルしてください。
fbc -lib mylib1.bas.
これで、静的ライブラリ
libmylib1.a が作成されます。
次に、今作ったライブラリを呼ぶ、C プログラムが、必要です。
私たちは、FreeBASIC ライブラリに持っている関数に、まさしく合致する原型を、加えなければなりません。
下に記載した C は、私たちの主入口点で、
Add2Numbers() を呼ぶために、2 つの変数を設定して、結果を表示します。
/* test1.c */
#include <stdio.h>
/* Prototype from libmylib.a */
int Add2Numbers
( int x,
int y
);
int main
()
{
int a =
5;
int b =
7;
int c = Add2Numbers
( a, b
);
printf( "a = %d\n", a
);
printf( "c = %d\n", b
);
printf( "a + b = %d\n", c
);
return 0;
}
私たちが作った FreeBASIC ライブラリを使って、この C プログラムをコンパイルするためには、私たちは、いつものように、
test1.c をコンパイルするだけでなく、これが、どのライブラリを必要とするか伝える必要があります。
この場合では、それは
libmylib1.a です。
gcc test1.c -L . -l mylib1 -o test1.exe
'-L .' オプションは、リンカに、カレント・ディレクトリの中で、ライブラリを捜すように、伝えます。そして、'-l mylib1' は、私たちがいま生成したライブラリにリンクしたいということを示します。
これは最も簡単なケースです。というのは、libmylib1.a ライブラリには、まったく依存がないからです。
mylib1.bas が、他のライブラリ、例えば FreeBASIC ランタイム・ライブラリ libfb.a を必要とするなら、私たちは、また、gcc にそれを指定する必要があります。
依存関係がある FreeBASIC ライブラリ
ここで、私たちは FreeBASIC ランタイムと描画ライブラリから、いくつかの特徴を使う、FreeBASICライブラリを生成します。
この場合、私たちは、追加必要なライブラリは、全て GCC に指定しなければなりません。
'' mylib2.bas
Sub TestGfx cdecl Alias "TestGfx"
()
Screen 12
Line (0,0)-(100,100),15
Sleep
End Sub
上にかかげた内容で、
mylib2.bas という名前のファイルを作成してください。そして、以下でそれをコンパイルしてください。
fbc -lib mylib2.bas
これで、静的ライブラリ
libmylib2.a が生成されます。
次に、いま作ったライブラリと呼ぶ、C プログラムが、必要です。
私たちは、まさに FreeBASIC ライブラリに持っている関数に合った原型を加えなければなりません。
この Cリストは、私たちの開始位置(エントリーポイント:呼び出し位置)と、終わる前に、ちょうど
TestGfx() 呼び出しを提供します。
/* test2.c */
void TestGfx();
int main
()
{
TestGfx();
return 0;
}
コンパイルして、
gcc に直接
test2.c をリンクするために、
gcc に、
libmylib2.a にリンクしたいと言うだけではなく、他のあらゆるライブラリにも
libmylib2.a が必要と言わなければなりません。
gcc test2.c -L. -
lmylib2 -L"C:\FreeBASIC\lib\win32" "C:\FreeBASIC\lib\win32\fbrt0.o" -lfbgfx -lfb -lgdi32 -o test2.exe
FreeBASIC ライブラリが使ったものに従い、いくつかの追加ライブラリを使うかもしれないので、
gcc コマンドラインに、ライブラリのすべての名前を指定しなければなりません。
この例では、FreeBASIC は、"C:\FreeBASIC" に置かれています。しかし、あなたは、あなたが FreeBASIC をインストールしたディレクトリを指定して下さい。
"C:\FreeBASIC\lib\win32\fbrt0.o" は、FreeBASIC ランタイム・ライブラリを初期化する、特別な始動ファイルです。
さらに具体的に言うと、C ランタイム・ライブラリの後で、しかし、私たちのプログラム・コードのどれかが呼ばれる前に、それは初期化されます。
追加の
-lfbgfx,
-lfb,
-lgdi32 は、リンクを完成するために必要な、追加ライブラリです。
実際のライブラリは、どの FreeBASIC ランタイム関数が使われているか、そして、プログラムが、DOS か Linux か、どのプラットホームに対してコンパイルされているかによって、異なります。
賢いリンカとして FreeBASIC を使う
FreeBASIC には、巧妙な内蔵の特徴があります。ライブラリに、どんなコンパイル時のオプションが使用されたか、そして、どの依存するライブラリが必要かを示す、少しの追加情報を、格納します。
これは、FreeBASIC だけの特長です。メイン・コンパイラとリンカとして
gcc を使用するとき、この種類の能力は見つけられません。
前掲の例
mylib2.bas と
test2.c を再利用して、違った風にコンパイルしリンクすることをちょっとやってみて下さい。私たちは、自身のたくさんのタイピングを省くことができます。
そのうえ、私たちは、FreeBASIC にビルドされたライブラリの依存性が何かについて、通常、知ったり覚えておく必要はありません。
先の例と同様に、
mylib2.bas を静的ライブラリにコンパイルしてください。
fbc -lib mytest2.bas
次に、Cテスト・プログラムをコンパイルします。
gcc コマンド・ラインのための '-c' オプションに注意してください。
これは、Cソースをコンパイルするだけで、まだそれをリンクするつもりでないことを示します。
test2.o には、それでも、開始位置(エントリーポイント:呼び出し位置)があります。しかし、私たちは、すぐに実行可能ファイル作成する代わりに、オブジェクト・ファイルにそれを入れるつもりです。
gcc -c test2.c -o test2.o
最後に、私たちは、リンク・ステップを実行するために
fbc を使います。
ここで、基本のソースファイルのなにもコンパイルしていません。しかし、私たちがFreeBASICの賢いリンク能力を使用するつもりで、コマンドラインはかなり簡単です:
fbc test2.o -l mylib2
これは、
test2.exe という名前の実行可能ファイルを作成します。というのは、
test2.o が、コマンドラインの最初で指定されたからです。
FreeBASIC は、
libmylib2.a に格納された追加情報を読んで、自動的に、どの追加ライブラリにリンクするかを知ります。
これは、直接
gcc を使うより簡単な負荷です。
多くの追加の FreeBASIC ビルド・ライブラリが必要なときは、特に負荷が少なくてすみます。
参照: