오전 10:48 2002-08-08
조경민 bro@shinbiro.com
DLL, LIB 잘 배포하기
==============================================================

문제상황
그냥 Static Lib나 DLL을 위한 DLL, LIB를 배포하면 인텔리센스와
스텝트레이스 디버깅을 할 수 없다.

주의할점
pdb와 소스코드까지 배포하는 것은 사내 자체 프로젝트용 라이브러리를
만들때 유효하지, 외부로 배포하면 모든 소스가 공개되는 것이므로
소스 유출없이 배포하기 위해서는 lib, dll, h 만 배포하도록 한다.

해결방안
1. 인텔리센스 지원하기
  라이브러리(test)를 통해 얻어진 인텔리센스(ASC Auto Sensitive Completion)
  test.ncb 파일을 이용하면 좋겠지만, VC6에서는 이를 이용하는 방법은 없다.
  C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin 안에
  crt.ncb, mfcatl.ncb, win32.ncb 들은 VC6가 실행되면서 자동으로 로드되지만
  이것처럼 test.ncb도 읽어지게 하는 방법은 없는것 같다.
  ( crt.ncb를 crt2.ncb로 바꾸고 test.ncb를 crt.ncb로 바꾸면 test 라이브러리
  인텔리가 자동 지원되지만, sprintf 같은 crt함수의 인텔리를 볼 수 없을것이다.
  regedit안의 모든 crt.ncb가 있는 곳 마다 똑같이 test.ncb를 생성해보기도
  했으나 실패하였다. )

  해결 방법: 성공적인 유일한 방법은 test 라이브러리를 가져다 쓰는 각 프로젝트
  마다 처음 한번만 test 라이브러리의 헤더파일을 파일 워크스페이스에
  Add to Files를 하는 것이다. 그리고 바로 프로젝트에서 빼내면 가져다쓰는 sample
  프로젝트안의 sample.ncb에 test에 관한 클래스, 함수 정보가 들어가게 된다.

2. 스텝 트레이스 디버깅 지원하기

  MFC DLL에서의 ( 실제 예로 해본것은 MFC Shared Extension DLL이었다. )

  스텝 트레이스가 되려면 소스 cpp, 소스 h, lib, dll, pdb 파일이 필요하다.
  VC6에서는 test 라이브러리(자신의) 함수정보를 위해서 debug/test.pdb를
  그리고 test 라이브러리에서 썼던 windows.h같은 외부것들에 대한 정보를
  vc60.pdb에 담게 되어 있다. 그런데 test라이브러리를 위해서는 하나의 pdb
  로 존재해야 하므로, test.pdb 하나에 모든 정보를 담도록 하자.
  프로젝트 세팅에 C++ 탭에서
   /Fd"Debug"
  로 된 것을
   /Fd"Debug/test.pdb"
  로 바꾸자.
  그리고 Link 탭에서
   /pdb:none
  으로 하여 incremental linking을 없앤다. ( incremental linking은 링크 속도를
  향상시키지만, vc60.pdb같은게 생겨서 dll 배포후 이를 가져다 쓸때 디버그
  트레이스 하기 힘들어진다. )

  실제 가져다 쓸때,
  test.dll과 test.pdb를 c:\winnt 같은 곳에다가 같은 곳에 넣도록한다.
  (mfc42d.dll과 mfc42d.pdb는 c:\winnt\system에 있었다. )

  그리고 sample 프로젝트에서 test 함수나 클래스를 쓴 부분에서 스텝 인투로 들어
  가려고 하면 test.pdb를 찾으려고 한다면 해당 pdb를 선택해 주고, 또 test.cpp를
  물어보면 배포된 소스의 test.cpp를 연결해주면 맴버변수값과 코드를 트레이스
  할 수 있게 된다.

  Static LIB에서 디버깅 지원

  프로젝트 세팅을  
   /Fd"Debug/test.pdb"
  이렇게 수정해주면 된다.
  실제 가져다 쓰는 것 역시 MFC DLL때와 마찬가지다.

'KB > MFC/Win32' 카테고리의 다른 글

HTML 소스 얻기  (0) 2004.03.19
MFC DLL Debug/Release 구분해서 하기  (0) 2004.03.19
def 파일에 대해서  (0) 2004.03.19
[ddk] RtlInitUnicode의 내부 코드  (0) 2004.03.19
[ddk] NT커널 모드 드라이버 in C++  (0) 2004.03.19

+ Recent posts