1

C++、Qt、Mingw32、および Netbeans を使用して、職場でアプリケーションを開発しています。社内のソフトウェア グループによって開発された社内 API を使用する必要があります。リンクする必要がある DLL のシンボル ライブラリ .lib ファイルがありますが、Mingw32 ではこれらのライブラリを使用できません。Microsoft Visual Studio では問題なく動作します。

シンボルをエクスポートして、Mingw32 で動作する .a シンボル ライブラリを作成する方法があるかどうかは誰にもわかりませんか? そうでない場合は、Visual Studio に移動する必要があると思います。

プログラム「pexports」を使用して .def ファイルと dlltool を作成しようとしましたが、うまくいきませんでした。まだ参照されていないシンボルエラーが発生しましたが、不平を言ったシンボルが.defに追加されました。しかし、プログラムはクラッシュします。Visual Studio で同じコードを試したところ、コンパイルして正常に実行されました。

4

5 に答える 5

0

DLL を動的にロードすることを検討しましたか? LoadLibrary、GetProcAddress など。すべての DLL のエントリ ポイントをカプセル化し、ライブラリをロードおよびアンロードし、すべての #typedef などを実行するクラスをおそらく簡単に作成できます。これは面倒な作業ですが、社内ライブラリの場合はおそらくエントリーポイントが多すぎませんか?

インポート ライブラリは過大評価されています。:p

于 2010-12-16T19:09:25.787 に答える
0

私はあきらめます、一部の人々は、名前のマングリングのために、C++エクスポートを使用してmicrosoftsコンパイラでコンパイルされたdllでは不可能だと言います

于 2010-12-17T15:00:44.957 に答える
0

役立つかどうかはわかりませんが、このガイドを確認してください。

于 2010-12-16T19:37:12.307 に答える
0

これがmysqlライブラリに対して行った方法です。

dllwrap を使用してエクスポートのリストを作成します。

dllwrap --export-all-symbols --output-def libmysql.def libmysql.dll --implib liblibmysql.a

これにより、.def ファイルにエクスポートのリストが作成されますが、名前マングリングが正しくありません。テキスト エディタで .def ファイルを編集し、「@」記号を削除します。通常、シンボル名には番号も追加されています。実験以外で正しい名前を決定する方法がわかりません。

以下を実行して、netbeans 互換ライブラリを作成します。

dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libMySQLclient.a -k

それをコンパイルすると、未定義のシンボルが得られます。未定義のシンボルには正しい装飾が施されます。.def ファイルを再度編集し、シンボル名を修正します。dlltool を再実行して、正しい .a ライブラリ ファイルを取得します。

于 2010-12-16T19:40:20.587 に答える
0

.a/.lib ではなく、DLL を直接リンクしようとしましたか? 通常、MinGW は喜んでそれを行います。

于 2010-12-16T20:16:14.987 に答える