FAQ: G95 での DLL の使用
g95 での dll の作成と使用に関する情報はどこにありますか?
dll とは何ですか?
dll を使用する利点はありますか?
g95 ではどのコマンド ラインを使用すればよいですか?
stdcall 呼び出し規約とは何ですか?
g95 ライブラリをコンパイルして dll を操作できますか?
g95 でコンパイルされた dll を動的にロードできますか?
dll の操作に使用できるツールは何ですか?
Q: g95 での dll の作成と使用に関する情報はどこにありますか?
A: g95 ニュースグループのアーカイブで、dll の作成方法に関する以前の投稿を検索してください。
MSVC および MinGW の Stdcall および DLL ツール: http://www.geocities.com/yongweiwu/stdcall.htm
Q: dll とは何ですか?
A: DLL は「ダイナミック リンク ライブラリ」の頭字語です。DLL は、MS Windows で一般的に使用されます。dll は通常、他のプログラムから呼び出されるライブラリにコンパイルされる 1 つ以上のサブルーチンで構成されます。g95 でコンパイルされたプログラムは、DLL 内のサブルーチンに静的にリンクできます。G95 でコンパイルされた dll は、他のプログラムで使用できます。動的リンクは現在 g95 ではサポートされていませんが、ここで説明されているように実装できます。
Q: dll を使用する利点はありますか?
A: DLL は、Visual Basic、Word、Excel などのプログラムから呼び出すことができます。
Q: g95 ではどのコマンド ラインを使用すればよいですか?
A:この例では、ex.dll という dll が生成されます。以下のコードをファイル ex.f90 に保存します。
サブルーチン ex(i)
整数 i
i=i+1
return
end
次のコマンドを使用して、dll をコンパイルおよび生成します。
g95 -c ex.f90
g95 -shared -mrtd -o ex.dll ex.o
-c コンパイルのみ、オブジェクト ファイル ex.o を生成
-o 出力ファイルに ex.dll という名前を付けます
-共有 dll を作成します
-mrtd 呼び出し規約を stdcall に設定します
デフォルトでは、g95 の内部関数は dll に含まれています。
dll を呼び出すテスト プログラムを次に示します。
$ 猫 > mytest.f90
!
ex.dll integer :: i
i = 6
call ex(i)
print *, i
end
$ g95 -o mytest mytest.f90 -Lを呼び出すテスト プログラム。ex.dll
$ mytest
7
$
Q. stdcall 呼び出し規約とは何ですか?
A:以下のリンク先に説明があります。
http://www.programmersheaven.com/2/Calling-conventions#stdcall
http://www.cs.cornell.edu/courses/cs412/2001sp/resources/microsoft-calling-conventions.html
Q. g95 ライブラリをコンパイルして dll を操作できますか?
A.はい。ビルドの手順はhttps://www.g95.org/source.html#BuildのCompilation Notesページにあります。
Q. g95 でコンパイルされた dll を動的にロードできますか? トップに戻る
A.以下の例は、David Miles によって提供されたコードを基にしていますが、g95 でコンパイルされた dll を含む小さな C プログラムをインクルードして、dll を動的にロードする方法を示しています。これには、コンパイル ノートのページで説明されているように、g95 ライブラリがコンパイルされている必要があります。オブジェクト ファイル g95main.o が /lib ディレクトリに存在する必要があります。ファイルは、g95 Cygwin バイナリ配布に含まれています。このアプローチの背後にある考え方は、g95 をライブラリとしてリンクすることです。これにより、GNU ビルド システムは 2 番目の「メイン」関数を無視します。プログラムを実行すると、ファイル main.exe、dll1.dll、および dll2.dll がすべて現在の作業ディレクトリに存在する必要があります。
以下のコードを dll1.f90 として保存します。
サブルーチン dll1
real :: arr(2,2)
call random_number(arr)
print*,arr
! dll2 を呼び出す
dynload を呼び出す
サブルーチン dll1 を終了する
以下のコードを dll2.f90 として保存します。
subroutine dll2
integer :: n=10
call sub1(n)
contains
subroutine sub1(n)
real :: arr(n,n)
print*,’here’
call random_number(arr)
print*,’done’
end subroutine sub1
end subroutine dll2
以下のコードを main.f90 として保存します。
プログラム m
dll1 を呼び出します
プログラム m を終了します
次のコードを load.c として保存します。このコードがコンパイルされ、オブジェクト コードが dll1 にリンクされ、実行時に dll2 が動的に読み込まれます。
// load.c – Cygwin バージョン
#include <dlfcn.h>
#include <stdio.h>
#include <errno.h>
void dynload_() {
void (*Function)(),*Handle;
ハンドル = dlopen( “dll2.dll”, RTLD_NOW );
if ( Handle == NULL ) {
fprintf( stderr, “読み込めません: %s\n”, dlerror() );
終了 (0); 関数 = (void(*)())dlsym(ハンドル、”dll2_”)
; if ( Function == NULL ) { fprintf( stderr, “関数 dll2_ が見つかりません: %s\n”, dlerror() );
}
(*関数)();
}
MinG では、このバージョンを使用します。
// load.c – MinGW バージョン
#include <windows.h>
void dynload_() {
typedef void (*pfunc)();
ハンドル hdll;
pfunc サブ 1;
hdll = LoadLibrary(“dll2.dll”);
sub1 = (pfunc)GetProcAddress(hdll, “dll2_”);
sub1();
戻る;
}
コンパイル:
gcc -c load.c
g95 -shared -Wl,–enable-auto-import -o dll1.dll dll1.f90 load.o
g95 -shared -Wl,–enable-auto-import -o dll2.dll dll2. f90 dll1.dll
g95 -o メイン main.f90 /lib/g95main.o -L. dll1.dll
出力:
$ main.exe
0.8784881 0.18738759 0.47982866 0.24209005
ここで
完了
$
Q. dll の操作に使用できるツールは何ですか?
A. binutilsパッケージには、次のツールが含まれています。
オブジェクトダンプ: オブジェクトファイルからの情報の表示
オブジェクトコピー オブジェクトファイルのコピーと翻訳
ナノメートル: オブジェクト ファイルからシンボルを一覧表示する
dllツール: dll のビルドと使用に必要なファイルを作成する
ストリップ: デバッグ シンボルを破棄する
ar アーカイブの作成、変更、および抽出
ランリブ コンテンツをアーカイブするためのインデックスを生成する
Microsoft はPEDUMPを提供しています。この一連の記事 ( 1 )、( 2 )には、pedump ユーティリティの使用に関する情報があります。
SmidgeonSoft は、無料の Windows デバッガー、逆アセンブラー、およびコード アナライザーを提供しています。
詳細: MingW での DLL の作成。