0

一般情報 [オプション]:
最近、静的ライブラリと動的ライブラリに慣れてきました。
現在、私は DLL の使用方法を学ぼうとしています。ボトルネックの可能性とそれらを防ぐ方法に遭遇するために、可能なすべての使用法を真似ようとしています。

私の目標: ex の 1 つのコンパイラでコンパイルされた DLL からグローバル変数をエクスポートする方法
を見つけることです。VS コンパイラ (IDE Visual studio 2010) を別のコンパイラ MingW (IDE Qt Creator 5.0) を使用してコンパイルされたクライアントに。実際には、一般的ではない特定のケースに興味がありますが、一般的なケースの情報が提供されれば、それは素晴らしいことです. クライアントへのdllの接続が暗黙的であること
も重要です(明示的ではなく、ライブラリを手動で接続します)。また、更新された dll を提供することによってクライアントのアプリケーションをサポートする方法 が興味深いので、そのような質問をしました。
プロジェクトの開始時にクライアントと dll に使用されるコンパイラのバージョンは同じである可能性がありますが、時間の経過とともに異なる場合があるため、このバイナリ互換性の問題を解決するにはどうすればよいですか?
dll で定義された配列をクライアントにエクスポートしようとして行き詰まりました。
DLL & クライアント

        /* header file. Is used by both: dll and client */
#ifdef EXPORT
    #define MYLIB __declspec(dllexport)
#else 
    #define MYLIB __declspec(dllimport)
#endif


extern "C" { // My be this directive not supported by MingW???

#ifdef VS2010 
    extern MYLIB char ImplicitDLLName[];
#else
    Q_DECL_IMPORT extern char ImplicitDLLName[];
#endif
}            

DLL

/* .cpp file in dll: */
#define EXPORT ""
#define VS2010 ""
char ImplicitDLLName[] = "MySUMoperator";

クライアント /* クライアント .cpp */

void MainWindow::on_pushButtonAdd_clicked()
{
    // ...
    printf("%s",ImplicitDLLName);

}

クライアントで配列を使用しようとすると、リンカーによって次のエラーが発生します。

 error: undefined reference to `_imp__ImplicitDLLName'

そこから発生する可能性のある名前のマングリングと互換性の問題を認識していますが、使用して無効にすることで解決しようとしています

extern "C"{} 

クライアントから返されたエラーによってs linker I can tell that I have failed to disable it, because it reports that reference on _imp__ImplicitDLLName wasnt が見つかったので、ImplicitDLLName が追加のシンボル (名前マングリング) で装飾されているだけだと推測します。
この問題は、異なるコンパイラでの配列の異なる実装またはメモリ内の配列の配置が原因で発生したのでしょうか??
質問: このバイナリ互換性の問題を解決するには??

4

0 に答える 0