1

私はプラグインシステムを使用してクロスプラットフォームのc++/ qtプロジェクトに取り組んでおり、Linuxではsoファイルを使用し、Windowsではdllを使用しています。Linuxではgccを使用し、WindowsではVisualStudio2010をcmakeを介して使用しています。問題は、プラグインがアプリケーションのソースコードから関数を呼び出す必要がある場合があることです。これは、ヘッダーファイルをインクルードするだけでgccを使用するLinuxで正常に機能します。しかし、Visual Studioでは、未解決の外部シンボルエラーが発生しました。

そうとdllファイルの動作が異なるためですか?

ありがとうございました。

4

1 に答える 1

2

Windowsでdllからシンボルをエクスポートするためのデフォルトの動作は、まったく逆です。デフォルトでは、シンボルは非表示であるため、明示的にエクスポートする必要があります。VC ++では、これは__declspec(dllexport) 宣言者によって行われます。

編集(追加情報):標準化されていないシステム固有の動作の領域に入っています...クロスプラットフォームの「プラグ可能な」コンポーネントシステムをC ++で作成する場合、予想以上に多くの問題が発生します。Windowsには、dllからエクスポートされるすべてのシンボルを定義するいわゆるインポートライブラリがあります。これらのシンボルを解決するには、これらのライブラリに対してリンクする必要があります。これは暗黙的なリンクと呼ばれます。明示的にリンクすることもできます。これは、実行時にdllとそのエクスポートされたシンボルをロードすることを意味します。ただし、これらはすべて、いわゆるバイナリ互換性の問題と比較した場合の技術的な詳細であり、コンポーネントシステムの設計時に考慮しなければ、ほぼ確実に死にます。

私は1つのことについて疑問に思っています:あなたはQtを使用していると言いました。Qtアプリケーションフレームワークには、プラグイン可能なコンポーネントを作成および構築するための独自のクロスプラットフォームの規則とルールがあります。これらにこだわってみませんか…?

于 2012-09-22T13:38:35.237 に答える