FANDOM


VisualStudio 2013 DLL 들이 서로 의존성이 있을 경우 dllexport, dllimport 문제Edit

C++의 DLL 들 간에 서로 의존성이 있을 경우 __declspec(dllexport), __declspec(dllimport) 설정에 주의해야 함.

예를 들어 다음과 같은 프로젝트 들이 있다고 하자.

  • DLL1
  • DLL2
    • DLL1 을 참조함
  • ClientApplication
    • DLL1, DLL2 를 참조함


이 경우 다음과 같이 빌드가 되야 한다.

  • DLL1 빌드시 DLL1 에서 내보내는 클래스, 함수, 변수 등은 __declspec(dllexport) 로 빌드 되야 함
  • DLL2 빌드시 DLL2 에서 내보내는 클래스, 함수, 변수 등은 __declspec(dllexport) 로 빌드 되야 함
    • 여기서 DLL1에서 내보내는 클래스, 함수, 변수 등은 __declspec(dllimport) 로 빌드 되야 함
  • ClientApplication 빌드시 DLL1, DLL2 에서 내보내는 클래스, 함수, 변수 등은 __declspec(dllimport) 로 빌드 되야 함


만약 다음과 같이 빌드 한다면 문제가 생긴다.

  • DLL1 빌드시 DLL1 에서 내보내는 클래스, 함수, 변수 등을 __declspec(dllexport) 로 빌드 함
  • DLL2 빌드시 DLL2 에서 내보내는 클래스, 함수, 변수 등을 __declspec(dllexport) 로 빌드 함
    • 여기서 DLL1에서 내보내는 클래스, 함수, 변수 등을 __declspec(dllexport) 로 빌드 함
  • ClientApplication 빌드시 DLL1, DLL2 에서 내보내는 클래스, 함수, 변수 등을 __declspec(dllimport) 로 빌드 함


위와 같이 한다면 다음과 같은 문제가 생길수 있다.

  • DLL1의 클래스, 함수, 변수 등의 static 선언한 것들을 DLL2 와 ClientApplication 에서 같이 참조할때 서로 주소가 다르거나 해서 클래스 같은 경우 내부 변수가 초기화가 안되어 null 포인터 참조 등으로 크래쉬 날 가능성이 높다.
    • 예) DLL1 에 싱글톤 클래스가 있다고 하자. 이때 DLL2 에서 GetInstance() 로 얻어온 것과 ClientApplication 에서 GetInstance() 로 얻어온 객체는 서로 다르다.


그러므로 다음과 같이 각 DLL 프로젝트 별로 #define 이름을 따로 설정하자

#ifdef DLL1_EXPORTS
   #define DLL1_API   __declspec(dllexport)
#else
   #define DLL1_API   __declspec(dllimport) 
#endif
 
#ifdef DLL2_EXPORTS
   #define DLL2_API   __declspec(dllexport)
#else
   #define DLL2_API   __declspec(dllimport) 
#endif


귀찮다고 다음과 같은

  1. define 을 DLL1 과 DLL2 에서 같이 사용하지 말자.
#ifdef DLL_EXPORTS
   #define DLL_API   __declspec(dllexport)
#else
   #define DLL_API   __declspec(dllimport) 
#endif

VisualStudio 2013 DLL 프로젝트 빌드시 .lib 파일이 생성되지 않고 .dll 파일만 생성Edit

__declspec(dllexport) 가 선언된 클래스, 함수, 변수 등이 없는게 원인.

해결책으로 다음과 같이 할 수 있을듯:

  • DLL 프로젝트로 생성하지 말고 헤더파일만
  1. include 한다.
    • __declspec(dllexport) 이 선언된 것이 없다는 것은 외부로 내보낼 것이 없다는 뜻
    • 고로 이 DLL 프로젝트엔 template 외에 없을 가능성이 높음
  • DLL 프로젝트를 생성하고 이 DLL 을 사용하는 프로젝트에서 DLL 참조를 하지 않고 헤더 파일만
  1. include 한다.
    • 헤더 파일을
  1. include 하는 것은 첫번째 방법과 같지만 DLL 관리 차원에선 나쁘진 않을듯
  • 더미 클래스, 함수, 변수 등을 만들어 __declspec(dllexport) 선언을 해준다.
    • 이 방법은 별 쓸모 없을듯

VisualStudio 2013 DLL의 클래스 멤버변수가 STL일때 C4251 경고나는 문제 Edit

http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html

https://msdn.microsoft.com/ko-kr/library/esew7y1w.aspx

https://support2.microsoft.com/default.aspx?scid=KB;EN-US;168958

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.