문제

나는 같은 수업이있다

class K {
  static int a;
  static int b;
}

이 수업이 포함 된 공유 라이브러리 (DLL)를 만들고 싶습니다. K. 내가 호출하는 도서관에서 만족 한 CPP 파일에서

int K::a = 0;
int K::b = 0;

정적 변수를 인스턴스화합니다. DLL은 오류없이 컴파일하지만 라이브러리를 사용하면 멤버의 해결되지 않은 외부 기호 오류가 발생합니다. K::a 그리고 K::b. 내가 그것을 사용하고 싶은 메인 프로그램에는 클래스 선언과 동일한 헤더가 포함되어 있습니다. K, 유일한 차이점은 내가 사용하는 라이브러리의 경우 class __declspec( dllexport ) K { ... } 그리고 주요 프로그램을 위해 class K { ... }

아마도 나는 둘 이상의 실수를하고있을 것입니다. 그래서 내 질문은 어떻게 할 수 있습니까?

  • 라이브러리에서 정적 멤버 클래스를 공유하도록 링커에 알려 주시겠습니까?
  • 메인 프로그램의 라이브러리에 인스턴스화 된 정적 클래스 멤버를 사용합니까?

추신. 나는 Visual Studio 2008을 사용합니다 ...

도움이 되었습니까?

해결책

하나는 사용해야합니다 __declspec( dllimport ) 기본 응용 프로그램의 헤더에서.

여기에 해결책이 있습니다. 헤더 파일 (라이브러리와 기본 응용 프로그램 모두 포함)은 다음과 같습니다.

#ifdef COMPILE_DLL
#define DLL_SPEC __declspec( dllexport )
#else
#define DLL_SPEC __declspec( dllimport )
#endif

class DLL_SPEC K {
   static int a;
   static int b;
}

라이브러리의 CPP 파일에는 다음이 포함됩니다.

int K::a = 0;
int K::b = 0;

라이브러리를 컴파일하려면 Macro Compile_dll을 정의해야합니다. 기본 응용 프로그램의 경우 정의되지 않아야합니다.

다른 팁

동적으로 대신 Libarary를 정적으로 연결하십시오.

또는 값을 반환하는 DLL에 전역 기능을 추가하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top