설치

마소에서 Express 버전을 무료로 배포했다.
개인, 기업에서도 무료일 뿐만 아니라 상용어플리케이션 제작까지 허용되기 때문에 부담없이 쓸수 있다.
Microsoft Express 위 사이트에 가면 Visual Studio 2008와 SQL Server 2008 다운로드받을수 있다.
단 사용자 등록을 해서 라이센스키를 발급받아야한다.
어차피 MFC 프로그래밍은 거의 하지 않을 예정이고 컨솔 프로그램이나 dll 혹은 테스트용 어플리케이션을 만드는게 주된 사용처라 이용해보기로 했다.
간단한 Console나 Windows Application으로 테스트 해보니 잘 돌아간다.

배포문제 발생

문제는 여기부터 -_-;; LGPL 소스를 쓸일이 있어서 dll을 만들어서 돌렸다.
어차피 라이브러리에서 MFC쓰는 것이 없으니 Use Standard Windows Libraries를 선택하고 모듈을 릴리즈 모드로 컴파일했다.
그런데 아무것도 깔리지 않은 PC에서 실행해보니 오류가 발생한다. 기존 VC6같은 경우에는 특정 MFC DLL이 없다고 오류를 내뱉어 줬었는데 이번에는 아무 에러 메시지가 없이 DLL이 LoadLibrary시에 실패해 버린다.
GetLastError로 확인해보니 오류 코드는 126(ERROR_MOD_NOT_FOUND). The specified module could not be found. 란다.
기존의 VC 모듈 배포시에 MFC DLL을 같이 배포했던 기억이 나서 디펜던시 워커 ( http://www.dependencywalker.com ) 로 결과물 DLL을 확인해보았다.
MSVCR90.DLL, MSVCP90.DLL이 필요하단다.
이 DLL에서도 MSCOREE.DLL이 필요하다고 해서 같이 넣고 돌려보았으나 역시나 실행시 LoadLibrary 실패.
Debug, Release 모드 변경 및 라이브러리 옵션을 변경해가면서 수많은 삽질 시작함... ㅠ.ㅜ

해결

혹시나 해서 모듈을 깔아주어야 하는게 있나 하고 검색해보니 재배포 패키지 다운로드 이런 재배포 패키지가 있다. -_-;
이 패키지를 깔아도 Debug 모드로 컴파일한 파일은 실행할 수 없다.
정식 버전도 그런지 모르지만 static 모드로 모듈을 포함할 수도 없다.
결국 LGPL 소스 및 작업하던 DLL 모두를 Release 모드, Use Standard Windows Libraries 로 컴파일하고 재배포 패키지 설치하니 동작했다.

결론

1. 배포 파일은 무조건 Release모드로 컴파일할것. Debug모드에서는 에러가 안나는데 Release 모드에서 에러난다면 99% 이상 프로그래머 잘못임. 2. 디버그 모드와 릴리즈 모드의 Output 저장 폴더를 반드시 구분할 것
3. 디버깅한다고 모듈의 Output 경로를 함부로 변경하지 않는다.
사용할 곳에서 .lib를 추가하고 dll만 복사해서 사용한다.
4. 다른 라이브러리(.lib)를 include시 디버그, 릴리즈 모드의 경로 설정을 정확하게 설정할 것.

+ Recent posts