0

実行時に特定のモジュール (共有ライブラリ) をロードするクロスプラットフォーム プログラムを c++ で作成しようとしています。これを行うために、Poco C++ Librariesの ClassLoader を使用しています。autoconf、automake、libtool を使用してコンパイル チェーンを作成しました。これは Linux 環境では問題になりませんが、Windows では問題が発生します。Makefile を利用できるようにコンパイルするときに、MinGW と MSYS を使用しています。ClassLoader は、Windows 固有の LoadLibrary() 関数を使用してモジュールをロードします。つまり、モジュールを DLL としてコンパイルする必要があります。

ライブラリにコンパイルするクラスは、メイン アプリケーション内の別のクラスを継承します。その後、make を実行しようとすると、未定義の参照について多くのエラーが表示され、共有ライブラリの構築が拒否されます。これは名前のマングリングが原因だと思います。それとも、ライブラリの外でクラスを継承できないからですか? (そのクラスはライブラリのソースに含まれていませんが、ヘッダー ファイルは見つかります)

MinGW + MSYS の下でコンパイルすることを主張するが、それでも LoadLibrary() を使用することがどれだけの問題をもたらすかはよくわかりません。これの経験がある人はいますか?

4

1 に答える 1

0

Windows では、DLL はビルド時にすべてのシンボルを解決する必要があります。Unix では、読み込み時まで問題を未解決のままにしておくことができます。この動作は現在、設計に組み込まれています。

これを変更するには、おそらくメイン アプリケーション (および DLL が依存する他のすべて) の基本クラスを独自の DLL に分割する必要があります。そうすれば、サブクラスを作成するライブラリをリンクすると、新しい DLL にリンクして、そのシンボルを完全に解決できます。問題は、すべてのシンボルが解決されたこの新しい DLL をビルドできる必要があることです。

于 2012-04-20T20:29:47.257 に答える