FreeBASIC マニュアルのトップに戻る

FreeBASIC TutInterfacingWithC

目次→教本→いっしょに学ぼうInterfacing with C←オリジナル・サイト

C と連結 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

注意!
何らかのスペル・チェックをしてください。そして、テキスト、コード、ファイル名を、照合して下さい。

序文

これは、簡単なライブラリを、C で記述して、これを FreeBASIC で使う方法の、小さい基本的なチュートリアルです。
The tutorial should be possible to follow without to much knowledge of C or FreeBASIC.
チュートリアルは、C や FreeBASIC について、多くの知識がなくても、読み進めることができると良いでしょう。
このチュートリアルを読むと、C にリンクされた、静的ライブラリと動的ライブラリを、コンパイルできるでしょう。
必要なヘッダーファイルを、FreeBASIC ヘッダーファイルに変換してください。そして、FreeBASIC プロジェクトで、ライブラリを使う方法を理解してください。

ライブラリとは何ですか?


前提条件

このチュートリアルは、FreeBASIC 0.16b と、この時点の MinGW32(Minimalist GNU on Windows の略で、フリーソフトウェアだけで純粋な Win32 用実行ファイルを作るための コンパイル環境) の最新の流通リリースで書かれて、テストされました。
注意として、Dev-cpp は、コンパイラ・ツール・チェーンなので、Dev-cpp は、MinGW32 を使用します。
あなたは、また、mingw32 の梱包で、code::blocks を得ます。

手元にある仕事の形式的説明

FreeBASIC で、Cライブラリの使用法を示すために、私たちは、いくつかの関数で可能な限り簡単なライブラリを生成する必要があります。
私たちのライブラリが、意図的に働くことを示す、Cのテストファイル。
次に、ライブラリ・ヘッダーファイルを、FreeBASIC ヘッダーファイル (*.bi) に、変換します。そして、最終的に、ライブラリを使って、FreeBASIC にテスト・プロジェクトを生成します。

ファイルを作成します。

それで、私たちのファイルリストは、下のようになるでしょう:
myClib.c: 私たちのライブラリを実装する Cファイル。
myClib.h: ライブラリのインタフェースについて説明する Cヘッダーファイル。
myClibCTest.c: C で、テスト・プログラムを実装する Cファイル。
myClib.bi: FreeBASICヘッダーファイル。 myClib.h の変換。
myClibFBTest.bas: FreeBASIC
make.cmd: サンプル・シェル・スクリプトで、ライブラリとテスト・ファイルをコンパイルします。

静的ライブラリになる C ファイル。myClib.c

/* 2つの整数を加えて、結果を返す関数 */
#include "myClib.h"
int SampleAddInt(int i1, int i2)
{
	return i1 + i2;
}

/* 何もしない関数 ;) */
void SampleFunction1()
{
	/* ここにコードを挿入 */
}

/* 常にゼロを返す関数 */
int SampleFunction2()
{
	/* ここにコードを挿入 */

	return 10;
}

ヘッダー・ファイル。myClib.h

int  SampleAddInt(int i1, int i2);
void SampleFunction1();
int  SampleFunction2();

C テスト・プロジェクトで、静的ライブラリが、C 互換であることを確かめます。 myClibCTest.c:

#include <stdio.h>
#include <stdlib.h>
#include "myClib.h"
int main(int argc, char *argv[])
{
  printf("SampleAddInt(5, 5):=%d\n", SampleAddInt(5, 5));
  system("PAUSE");
  return 0;
}

C ヘッダーファイルを、FreeBASIC ヘッダーファイルに変換します。 myClib.bi:

静的ライブラリを連結して、自動的に静的なライブラリ(ここでは #inclib "myClib")を含むようにするために、下のファイルを使います。

''include file for libmyClib.a
#IfNDef __myClib_bi__
#Define __myClib_bi__
#inclib "myClib"

Declare Function SampleAddInt cdecl Alias "SampleAddInt" (ByVal i1 As Integer, ByVal i2 As Integer) As Integer
Declare Sub SampleFunction1 cdecl Alias "SampleFunction1" ()
Declare Function SampleFunction2 cdecl Alias "SampleFunction2" () As Integer
#endif

そして、最終的に、FreeBASIC ファイルは、ライブラリを使います。 myClibFBTest.bas:

''myClib.bi で、関数をテストします
#include "myClib.bi"
''
Print "SampleAddInt(10, 10):=", SampleAddInt (10, 10)
'' ただ、dumy 呼び出し
SampleFunction1 ()
''
Print "SampleFunction2():=", SampleFunction2 ()

make ファイル: make.cmd
私は、すべてのファイルをコンパイルするために、バッチ・ファイルを作成しました。
Cで、静的ライブラリを使うサンプルを含んでいます。
先頭のコンフィグ行に注意してください。ここは、あなたのスイートの設定に合わせて変更が必要です。
@REM TODO: Set PATH's for this session.
SET PATH=C:\mingw32\bin;c:\mingw32\mingw32\bin
SET MINGW_INCLUDE="C:/MinGW32/include"
SET MINGW_LIB="C:/MinGW32/lib"

@REM
@REM fbc testing SET fbc="C:\portableapps\FreeBASIC\fbc.exe"
SET fbc="C:\FreeBasic16b\fbc.exe"
@echo *** Verify pat's to compilers
@pause
@echo off

@REM
@REM Remove old files
DEL /F *.o  *.a myClibFBTest.exe

@REM
@REM Create static lib from c source
gcc.exe -c myClib.c -o myClib.o -I%MINGW_INCLUDE%

@REM
@REM ar: creating libstatictest.a
ar r libmyClib.a myClib.o

@REM
@REM No nead for ranlib anymore? ar is supposed to take care of it
ranlib libmyClib.a

@REM
@REM Create a test with a C file

gcc.exe -c myClibCTest.c -o myClibCTest.o -I%MINGW_INCLUDE%
gcc.exe myClibCTest.o -o "myClibCTest.exe" -L%MINGW_LIB% libmyClib.a

echo =====================================
echo RUnning C sample
echo =====================================
myClibCTest.exe

echo =====================================
echo Creating FreeBASIC sample
echo =====================================
REM I thought this explicit reference is unnecessary as I use #inclib
SET fbcop= -I myClib
SET fbcfl="myClibFBTest.bas"
%fbc% %fbcop% %fbcfl%
echo =====================================
echo RUnning FreeBASIC sample
echo =====================================
myClibFBTest.exe
@pause


遭遇するエラー・メッセージと、その解決策

未定義の参照

静的な Cライブラリに対して、FreeBASIC ヘッダーファイルで cdecl別名 "functionname" を使わずにリンクしようとすると、下のようなエラーになります。

C:\code>"C:\FreeBasic16b\fbc.exe"     "myClibFBTest.bas"
myClibFBTest.o:fake:(.text+0x3d): undefined reference to `SAMPLEADDINT@8'
myClibFBTest.o:fake:(.text+0x4a): undefined reference to `SAMPLEFUNCTION1@0'
myClibFBTest.o:fake:(.text+0x67): undefined reference to `SAMPLEFUNCTION2@0'
Press any key to continue . . .

これを解決するために、*.bi ファイルに、下のような関数宣言を置かなければなりません:


Declare Function SampleAddInt(ByVal i1 As Integer, ByVal i2 As Integer) As Integer


そして、これを、何か下のようなものに変えてください:

Declare Function SampleAddInt cdecl Alias "SampleAddInt" (ByVal i1 As Integer, ByVal i2 As Integer) As Integer



付録 A: リンク

このチュートリアルのもとは、フォーラムのいくつかのスレッドです。
チュートリアルが発展して、単独で成立するようになると、スレッドへのリンクは取り外されるかもしれません。
いくつかの面白いリンクは、FreeBASIC で作られて、他の言語あるいは、ビザ versa によって使用された、ライブラリの接続についての情報を、含んでいます。
どうやって、Cプロジェクトを、包含用の静的ライブラリとしてコンパイルしますか?

いっしょに学ぼう に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2018-02-11 11:47:54
日本語翻訳:WATANABE Makoto、原文著作者:UtenNavn

ホームページのトップに戻る

表示-非営利-継承