DLL에서 정적 라이브러리 사용하기
Posted 2009/04/02 11:16|
|
|
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
환경 : Windows XP
Visual Studio 2008 SP1, 한글
일반적으로 바이너리에 정적 라이브러리를 포함하기 위해서는 아래 그림과 같이 프로젝트 속성 페이지에서
"구성속성 - 일반 - MFC 사용"을 정적 라이브러리에서 MFC 사용으로 변경하면 된다.
하지만, DLL의 경우 "fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds" 이런 에러 메세지를 만나게 될것이다.
이럴때는 아래의 두개의 이미지에 보이는대로 "전처리기 - 전처리기 정의"에 _AFXDLL를 추가하고 "코드 생성 - 런타임 라이브러리"를 다중 스레드 디버그 DLL(/MDd)로 변경하면된다.
* 릴리즈 모드일때는 다중 스레드 DLL(/MD)로 변경하면 되겠죠.
위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
- Filed under : 프로그래밍/MFC & Win32
- 5 Comments Trackback


박진수
| 2009/05/14 00:27 | PERMALINK | EDIT | REPLY |감사합니다. ^^ 많은 도움 받고 가네요
왕종선
| 2009/05/27 14:49 | PERMALINK | EDIT | REPLY |우와! 정말 킹왕짱감사합니다.
durumul.com
| 2009/06/16 14:01 | PERMALINK | EDIT | REPLY |근데 이렇게 하면 빌드는 에러없이 되도 나중에 Dependency 로 보면 그 DLL이 MFC에 정적으로 빌드된게 아니란걸 알게될겁니다.
즉,MFCxx.dll 들이 물려있습니다.
예를 들어 , MFC 클래스중 CDialog 를 파생한 나만의 CMyDialog를 DLL에 구현하고 EXE 측에서 이를 오버라이드한 CAboutDlg를 생성한후 런하면 바로 죽습니다. (MFC클래스를 안쓰면 잘돌겠지만,,,API만 쓴다면 표준 라이브러리 DLL 과 구분지을 필요도 없고..목적은 MFC를 쓰려는건데..)
즉,만들었지만 MFC함수나 클래스를 쓰지도 못하는 빈껍데기의 무용지물의 정적 dll이되고 마는거죠..
이 MFC 를 정적으로 링크한 DLL을 만들려면 위옵션과 반대로 /MT 에다가 _AFXDLL은 없어야 하며, 정적라이브러리에서 MFC사용으로 해야 합니다.. 단지,이것 EXE와 AFX_MANAGE_STATE 관련해서 오류가 난다는것..
오류가 없으려면 DLL내에서 만든 클래스는 오직 DLL내에서만 사용하고 소멸되어져야 하거나, 아니면 AfxGetApp()나 MFC내부적으로 쓰는 위의 AFX_MANAGE_STATE 관련 코드를 타지않도록 피해가야 한다는것입니다.
결국 MFC에 문제가 많다는 결론입니다.
MFC의 많은 DLL을 설치배포시 포함안하려고 정적링크를 택해서 EXE만들고, 그에 딸린 나만의 DLL 식구들도 정적으로 링크해서 빌드하려했는데,위의 쓰레드나 메시지 처리등에서 치명적인 오류로 걸리는 군요...
여기까지 밝혀낸 진실인데,, 제가 모르는 부분있으면 태클또논 조언바랍니다.
http://www.krkim.net
토론 및 글은 이곳에 오셔서 쓸수 있습니다..
http://durumul.blogspot.com
LegendFinger
| 2009/06/17 09:38 | PERMALINK | EDIT |아 좋은 의견이시군요 시간나는대로 바로 확인해보겠습니다.
감사해요
six605
| 2010/07/24 17:20 | PERMALINK | EDIT | REPLY |좋은 정보 잘 보고 갑니다. :)
위에 "durumul.com"님 말씀대로라면 뭔가 문제가 있다는 건데
이렇게 배포해도 상관 없나 모르겠네요..