0

저는이 정적 변수를 지금 몇 시간 동안이 문제를 해결하려고 노력하고 있습니다. 문제이 링커 오류의 원인은 무엇입니까?

프로젝트 : 내가 여기에 비주얼 스튜디오 2010를 사용하고있어 상황의 간단한 개요입니다

//foo.h 
#pragma once 

class SUP 
{ 
public: 
    static int staticint; 
}; 

:의 proja에서

-ProjA (outputs a .dll and .lib) 
-ProjB (outputs a .exe) 

, 나는이 두 파일이

//foo.cpp 
#include "foo.h" 
int SUP::staticint = 10; 

ProjB는 ProjA.lib에 링크

이제 6,
//main.cpp 
#include "{Full_Path}foo.h" 
int main(){ 
    std::cout << SUP::staticint << std:: endl; 
} 

은 MAIN.CPP는 아무 문제없이 컴파일하지만 내가 프로젝트를 빌드 할 때, 나는 다음과 같은 오류 얻을 :

main.obj : error LNK2001: unresolved external symbol "public: static int SUP::staticint" ([email protected]@@2HA)

나는 거의 100 %가 특정 내가 설정 한거야을 ProjB의 옵션을 올바르게 설정하십시오. "추가 종속성"에서 "ProjA.lib"을 모두 가지고 있고 "추가 라이브러리 디렉터리"아래에 ProjA.lib 파일이 생성 된 디렉터리의 경로가 있습니다.

난의 proja 출력에게 .MAP 파일을 했어, 그리고지도에서 내가 발견 : 0003:00004458 [email protected]@@2HA 10049458 foo.obj

를 그래서 나는 그것이 staticint가 올바르게 정의되어 있음을 의미 같은데요.

무엇이 잘못 될 수 있습니까? 분명히, 나는 뭔가 잘못하고 있지만, 나는 무엇을 보지 못한다. ProjB가 올바른 .lib 파일과 연결되는지 확인했습니다. 나는 include 디렉토리가 좋은지 확인했다. 나는 정적 변수의 정의가 건전하다는 것을 확인했다. 필요한 경우 다른 정보를 제공 할 것입니다.

+1

가능성 있음 [관련 질문] (http://stackoverflow.com/questions/2479784/exporting-static-data-in-a-dll)? – tmpearce

답변

1

MSVS에서는 내 보낸 기호를 __declspec(dllexport)으로 명시 적으로 선언해야합니다.

SUP은 다른 라이브러리에 있기 때문에 내 보낸 기호 만 다른 모듈에서 사용할 수 있습니다.이 기호는 __declspec(dllimport)으로 표시해야합니다.

이 이중 동작은 일반적으로 매크로를 통해 달성된다

#ifdef EXPORT_MODULE 
#define DLLIMPEXP __declspec(dllexport) 
#else 
#define DLLIMPEXP __declspec(dllimport) 
#endif 

와 클래스는 EXPORT_MODULE이 기호를 수출 프로젝트에 정의되어

class DLLIMPEXP SUP 
{ 
public: 
    static int staticint; 
}; 

으로 선언했다.

+0

[This (http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/e6badd8c-434a-4c5b-b5c2-1d58f4b5dd81)는 데이터를 내보낼 수 없으며 함수 만 내보낼 수 있다고 제안합니다. 이게 바뀌 었습니까? – tmpearce

+0

@tmpearce 운영자가이를 테스트하고 Google에 알려주세요. 내게는, 그 링크가 이상하게 보일 것입니다,하지만 다시는 처음에는 틀렸을 것입니다 :) –

+0

맞아요, DLL 내보내기에 문제가있었습니다. – Lanaru