FAQ: g95 での dll の使用

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: 次のリンクで説明が提供されてい

ます
。 -conventions.html

Q. g95 ライブラリをコンパイルして dll を操作できますか?
A. はい。ビルドの手順はhttps://www.g95.org/src.shtml#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() );
終了 (0);
}
(*関数)();
}
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 の作成。

タイトルとURLをコピーしました