6

ロードするメインの実行可能ファイルがあります。dll/.soプラグイン。Linux では問題なく動作しますが、Windows (Visual Studio 2012) では未定義の参照エラーで失敗します。

プラグインはsession->SendLine("bla")、Main 実行可能ファイルで定義されているような関数を使用します。(プラグインに含まれる .h で定義されたセッションとメソッドのクラスですが、実際の関数はメイン exec でコンパイルされた .cpp にあります)。

tl;dr: "メインの実行可能ファイルで定義されたプラグインの未定義の参照を無視するには、Windows リンカが必要です"

Windowsで「動作させる」が、Linuxとの互換性を維持するための最良の方法は何#ifdefですか?

4

4 に答える 4

5

Windowsでのライブラリのリンクは、Linuxでの処理とはまったく異なる方法で処理されます。プラグインからホスト実行可能ファイルへのリンクは、Linuxでは簡単ですが、Windowsではそれほど簡単ではありません。

Windowsでは、外部モジュールにリンクする従来の方法は、.libファイルによって提供されるインポートライブラリを使用することです。そのようにするには、プラグインが呼び出す必要のあるすべてのエクスポートされた関数を含む実行可能ファイルのインポートライブラリを作成する必要があります。実行可能ファイルのインポートライブラリを作成したことはありません。通常、DLLに対して行います。実行可能ファイルで機能するかどうかさえわかりません。

他のいくつかのオプション:

  1. 実行可能ファイルから関数をエクスポートしGetProcAddress、プラグインで使用して実行時に関数にバインドします。
  2. プラグインを初期化するときは、プラグインに必要なすべての機能を含むインターフェースを渡します。
于 2013-03-16T21:42:46.240 に答える
3

mingw を使用する場合、これは、次のように実行可能ファイルのインポート ライブラリを生成することで実行できます。

$ dlltool --export-all-symbols <program>.exe -l lib<program>.a -D <program>.exe

-l引数は作成するライブラリのファイル名を指定し、引数-Dはライブラリの dllname を指定します (これがプログラム名と同じであることが重要です)。-l<program>dll をコンパイルするには、リンカー フラグを追加してインポート ライブラリにリンクする必要があります。

エクスポートされるシンボルを制限したい場合は、最初に defs ファイルを生成して編集し、次に defs ファイルからインポート ライブラリを生成します。

$ dlltool --export-all-symbols <program>.exe -z <program>.defs
$ vi <program>.defs # Edit the list of exported symbols
$ dlltool -d <program>.defs -l lib<program>.a -D <program>.exe

注: dlltool の名前は、mingw 環境 (つまりi686-w64-mingw32-dlltool、i686 ウィンドウへのクロスコンパイル用の Fedora) によって異なる場合があります。

于 2013-08-09T13:27:52.510 に答える
2

DLL から実行可能ファイルで定義された関数を呼び出すには、DLL から関数をエクスポートするのと同様に、__declspec(dllexport) を使用して実行可能ファイルからそれらの関数をエクスポートする必要があります。

コンパイラは、エクスポートされた関数のスタブを含む実行可能ファイルのインポート ライブラリを生成します。

DLL をビルドするときに、このインポート ライブラリとリンクします。

于 2013-03-18T02:12:56.607 に答える
0

私は同じ問題を抱えていました-プロプライエタリアプリa.exeの場合、プラグインp.dllを構築したかったのです。

1つの投稿が提案されました:

$ dlltool --export-all-symbols a.exe -z a.defs
dlltool: a.exe: no symbols

しかし、a.exeに含まれるa.libファイルがありました。繰り返しますが、[便利な] EXPORTS はありません:

$ dlltool --export-all-symbols a.lib -z a.defs

$ cat a.defs
; dlltool --export-all-symbols -z a.defs q.lib
EXPORTS
    _NULL_IMPORT_DESCRIPTOR @ 1 DATA
    _IMPORT_DESCRIPTOR_a @ 2 DATA

[インポート ライブラリ (.lib) から変換されたライブラリ ファイル (.a) を使用して gcc で dll をビルドするも参照してください。

最終的に、MinGW メーリング リストでヒントを見つけて、nmが解決策になりました。

$ echo EXPORTS >a.def
$ nm -p a.lib |egrep 'T _' |sed 's/0* T _//' >>a.def

この .def ファイルがあれば、簡単です。

$ #generate liba.a that has the callbacks for the symbols in *a.exe* (what a.lib has, too)
$ dlltool -v -l liba.a -d a.def

$ #build my plugin, linking to liba.a
$ gcc -shared p.c -L. -la -o p.dll
于 2014-11-13T09:51:32.397 に答える