2016-07-09 2 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을 원하는 기본 주소로로드 할 수 없으면 데이터가 재배치 될 수 있으므로 포인터가 필요합니다.

관련 문제