2016-07-09 29 views
0

私はVisual Studioの新機能ではありませんが、これに関する多くの質問があります。しかし、私は本当にこれを理解することはできません。これはエラーです:Visual Studio 2015で未解決の外部シンボルリンカーエラー

1>moc_displaycounter.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Counter::staticMetaObject" ([email protected]@@[email protected]@B) 
1>moc_displaymanometer.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const ManoMeter::staticMetaObject" ([email protected]@@[email protected]@B) 
1>moc_displaysvgmeter.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const SVGMeter::staticMetaObject" ([email protected]@@[email protected]@B) 

だから私は、インポートライブラリにDUMPBIN /輸出を行なったし、それがこの返された:私は、インポートライブラリ上の正確な署名を確認

Microsoft (R) COFF/PE Dumper Version 14.00.24210.0 
Copyright (C) Microsoft Corporation. All rights reserved. 

Dump of file analogwidgets.lib 

File Type: LIBRARY 

    Exports 

     ordinal name 

        [email protected]@[email protected]@@@Z (public: __cdecl AbstractMeter::AbstractMeter(class QWidget *)) 
        [email protected]@@[email protected]@B (public: static struct QMetaObject const Counter::staticMetaObject) 
        [email protected]@@[email protected]@B (public: static struct QMetaObject const Item::staticMetaObject) 
        [email protected]@@[email protected]@B (public: static struct QMetaObject const Led::staticMetaObject) 
        [email protected]@@[email protected]@B (public: static struct QMetaObject const ManoMeter::staticMetaObject) 
        [email protected]@@[email protected]@B (public: static struct QMetaObject const PotentioMeter::staticMetaObject) 
        [email protected]@@[email protected]@B (public: static struct QMetaObject const SVGMeter::staticMetaObject) 

を。良い尺度のために、に依存していることを確認して、これらのシンボルがDLL内にあることを確認しました(はい、私はリンクプロセスに参加しませんが、インポートライブラリが壊れていないことを確認しています)リンクされません。デバッグとリリースx64ビルドの両方を試してみましたが、成功しませんでした。以前はVSの他のバージョンでは問題はありませんでした。

次に何をすべきかに関するアイデアはありますか?

+0

静的なクラス変数を定義するのを忘れてしまったようです。 –

+0

未定義の外部シンボルエラーは、何かを宣言して定義するのを忘れた場合に発生します。メンバー関数または静的変数である可能性があります。 –

答えて

2

DLLから静的データをエクスポートするのは少し難解です。リンカエラーは、あなたが忘れたことを示しています。クライアントコードで使用される場合、クラスは__declspec(dllimport)として宣言されていません。リプロコード:

がheader.h:

#ifdef _USRDLL 
#define EXPORTED __declspec(dllexport) 
#else 
#define EXPORTED //__declspec(dllimport)  // <=== Problem here! 
#endif 

struct EXPORTED QMetaObject { 
public: 
    int foo; 
}; 

class EXPORTED Counter { 
public: 
    static const QMetaObject staticMetaObject; 
}; 

Source.cpp:

#include "header.h" 
const QMetaObject Counter::staticMetaObject; 

Client.cpp:

#include "Header.h" 

int main() 
{ 
    auto foo = Counter::staticMetaObject.foo; 
    return 0; 
} 

リンカーエラー:

ConsoleApplication1.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Counter::staticMetaObject" ([email protected]@@[email protected]@B)

Header.hの//コメントを削除して修正すると、コンパイラはDLLデータへのポインタを正しく使用する方法を知るようになりました。元のリンカエラーがこの問題についてあなたにどのように伝えられたかに注意してください。ライブラリでDumpbin.exe/exportsを実行すると、エクスポートされたメンバ名が[email protected]@@[email protected]@Bに変更されていることがわかります。これはデータへのポインタです。 DLLが優先ベースアドレスでロードできない場合、データが再配置される可能性があるため、ポインタが必要です。

関連する問題