Class를 dllexport하니 C4251이 발생합니다.
Visual Studio 2013에서 DLL을 생성할 프로젝트를 만들고 CLASS자체를 dllexport시켰습니다. 그런데 C4251이 발생합니다.
구글이나 네이버에 검색해봐도 이런 오류가 거의 발생하지 않는지 관련된 문서나 글도 거의 존재하지 않아서 질문합니다. 아래는 소스코드입니다.
#pragma once
#include
#include
using std::string;
class __declspec(dllexport) MailSlot
{
private: //Private Variables
BOOL STATUS = FALSE;
HANDLE MAILSLOT_HANDLE = INVALID_HANDLE_VALUE;
const string DEFAULT_MAILSLOT_NAME = "\\\\.\\MailSlot\\";
string MailSlot_Name;
public: //Public Functions
MailSlot(string MailSlotName);
BOOL Create();
BOOL Connect();
BOOL CloseMailSlot();
~MailSlot();
};
여기서 경고가 뜨는 부분은
const string DEFAULT_MAILSLOT_NAME = "\\\\.\\MailSlot\\";
string MailSlot_Name;
여기 이 두 부분, string형을 사용한 코드입니다.
소스코드는 뭐 위에 보시는 바와 같이 .cpp파일에는 대강
BOOL CloseMailSlot()
{
return CloseHandle(MAILSLOT_HANDLE);
}
이런식의 종류의 코드가 포함되어있습니다.
C4251 경고를 뜨지않게 하는법없나요??(무시하는 방법제외)
경고의 전문을 올려주시면 좋겠습니다.
경고의 전문을 올려주시면 좋겠습니다. MailSlot_Name 이 문제가 되는 걸로 짐작이 가는 게 있는데 확실친 않네요.
전문입니다.
1>d:\abc\software\ipc\workspace\inc\mailslot.h(15): warning C4251: 'MailSlot::DEFAULT_MAILSLOT_NAME' : class 'std::basic_string,std::allocator>'에서는 class 'MailSlot'의 클라이언트에서 DLL 인터페이스를 사용하도록 지정해야 합니다.
1>d:\abc\software\ipc\workspace\inc\mailslot.h(16): warning C4251: 'MailSlot::MailSlot_Name' : class 'std::basic_string,std::allocator>'에서는 class 'MailSlot'의 클라이언트에서 DLL 인터페이스를 사용하도록 지정해야 합니다.
MailSlot 클래스는 DLL로 노출되었지만
MailSlot 클래스는 DLL로 노출되었지만 std::string은 DLL로 노출이 되지 않아서 생기는 문제로 보입니다.
구글로 검색해보시면, 몇몇 한글로 된 블로그에서 관련된 문제들을 다루고 있습니다. 개인적으로는 그 중에
http://mgun.tistory.com/508
이 제일 간명하게 설명하고 있고, 특히 이 페이지에 첨부된 PDF 파일에 좀 더 원리적으로 상세한 설명이 있습니다.
제 생각에 해결 방법은 세 가지, 하지만 사실상 두 가지 방법이 있습니다.
1) std:string 및 그와 연관된 템플릿 클래스들을 모두 DLL export 한다.
이론적으로는 가능하겠지만 좋은 방법이 아닙니다.
2) 클래스를 노출하는 경우, 멤버 변수들에 STL 멤버를 사용하지 않는다.
3) http://msdn.microsoft.com/ko-kr/library/esew7y1w.aspx 에서 제안하는 것처럼, 클래스 전체를 노출하는 대신 해당 클래스의 인스턴스를 생성하는 함수만 노출한다.
제가 프로젝트를 진행한다면 3)의 방법을 쓰겠지만, 어쩔 수 없다면 2) 방법을 써야하겠지요.
어...
사실 C#하고 Java만 써오던 저로서 말씀을 들으니 어떻게 해야 할지 막막합니다;
pdf파일처럼 해주었지만 오히려 오류를 내뿜고 컴파일은 아예되지도않고..
3번방법처럼 해당 클래스의 인스턴트를 생성하는 함수만 노출한다 이것도 이해가안되요.. 번거로우시겠지만 한번만 자세하게 설명해주시면 안될까용??
아래처럼 해보았더니 오류는 사라지는데
class __declspec(dllexport) MailSlot이것을
class __declspec(dllexport) MailSlot : string
이렇게 해주니깐 오류는 사라지는데 후에 사용할때 다른문제가 없을까요??
클래스 대신 생성/삭제 함수만 export 하고 가상함수를 활용하는 방식
-- 안돌려봤습니다. 저 MSDN에서 클래스 노출하지
-- 안돌려봤습니다. 저 MSDN에서 클래스 노출하지 않을 수 있다는게 대강 이런 식이라는 말입니다.
감사해요
이렇게 상세하게 코드를 짜주셨다니..
초짜에게 과할정도입니다. 감사합니다^^
댓글 달기