블로그 이미지
대갈장군

calendar

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Notice

2008. 10. 21. 17:20 프로그래밍/MSDN

참고 자료: http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspx

관련글: http://diehard98.tistory.com/entry/MSDN-Manifest-파일 (manifest 파일에 대한 설명 및 재배포 방법)


Visual Studio 2005의 C++를 이용해서 프로그램을 작성하다 보면 프로젝트의 Properties 에서 Code Generation 속성에 보면 /MT, /MTd, /MD, /MDd 와 같은 다양한 형태의 옵션 설정이 가능하다.

이것을 어떻게 설정하는가에 따라서 내가 만드는 프로그램이 어떤 DLL과 연결이 되는지정적(Static)으로 라이브러리를 링크 할 것인지 아니면 동적(Dynamic)으로 라이브러리를 링크 할 것인지를 결정할 수 있다.

이 속성을 우습게 보았다가 나는 큰 코 다쳤다. =_+ 헐

Standard C++ Library

Characteristics

Option

Preprocessor directives

LIBCPMT.LIB

Multithreaded, static link

/MT

_MT

MSVCPRT.LIB

Multithreaded, dynamic link (import library for MSVCP80.dll)

/MD

_MT, _DLL

LIBCPMTD.LIB

Multithreaded, static link

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

Multithreaded, dynamic link (import library for MSVCP80D.DLL)

/MDd

_DEBUG, _MT, _DLL


일단, 위의 테이블은 내가 프로그램에서 Standard C++ Library에 해당되는 헤더 파일을 불러왔을 경우에 연결되는 라이브러리들을 보여준다.

Standard C++ Library라 함은 http://en.wikipedia.org/wiki/C_Standard_Library 에 나와 있는 헤더들을 말한다. 아마도 기본적인 프로그램을 작성한다면 최소한 저것 중에 하나는 들어가게 된다.

물론 아닌 사람도 있겠지만... 헐헐헐...

아무튼, 그런 경우가 아니면, 링크 되는 라이브러리가 바뀌긴 한다만 영어 철자 하나 차이로 바뀐다. 일단은 Standard C++ Library를 사용한다고 생각하자.

원래 과거에는 (정확히는 모르겠지만 Visual Studio 6 까지 일것이다.) Single Thread 옵션도 지원이 되었다. 하지만 Visual Studio 2005에서는 무조건 Multi Thread로 프로그램을 작성해야 한다.

앞서 내가 작성한 글에도 있지만 C 런타임 라이브러리가 옛날에 작성될 때 Thread란 개념이 없다보니 Multi Thread로 동작하는 프로그램의 경우 '자원 경쟁'에 의한 오작동 했다.

아마도 이런 문제를 싸그리 날려버리기 위해서 2005에서는 오직 Multi Thread만 지원하나 보다.

표에 보면 /MT와 /MTd가 있는데 이 소문자 d는 Debug 버전을 의미한다. 나도 사실 Debug와 Release의 차이를 전혀 모르다가 다른 컴퓨터에 내 프로그램을 설치하면서 그 차이를 알게 되었다.

간단히 말해서 Debug 버전은 해당 Visual Studio가 설치된 컴퓨터에서만 '테스트'용으로 사용한다. 즉, Visual Studio가 설치안된 컴퓨터에다가 Debug 버젼으로 완성된 .exe 파일 들고가서 실행해봐야 실행이 안되고 The system cannot run this program. 어쩌구 저쩌구 그런다.

왜냐면 Debug 버젼은 실행시 링크되어야 할 DLL 파일이 Visual Studio가 설치되지 않은 컴퓨터의 .NET Framework Assembly 폴더인 Windows/WinSxS 폴더에 존재하지 않기 때문이다.

또한 ELUA인가 뭔가에 의해서 Debug 버전의 DLL 파일은 재배포가 금지되어 있다. 즉, 배포를 목적으로 한다면 Release 버전으로 작성하라~ 이말이다.

아무튼, 테이블에서 보이는 한가지 더 특별한 차이는 Static 과 Dynamic 링크이다. Static 링크는 실행 파일에다가 필요한 DLL 을 같이 묶어서 .exe 파일로 만든다. (개념적으로 그렇긴 한데 DLL 전체를 포함시키는 것인지 아닌지는 잘 모르겠다.)

그리고 Dynamic의 경우는 Static과는 달리 실행을 할때 찾아서 링크를 시키게 되므로 반드시 실행 파일과 같이 제공되어야 한다.

고로 배포를 목적으로 하는 프로그램이라면 반드시 /MD 옵션으로 만들어야 하고 따라서 MSVCPRT.LIB가 프로그램 작성시 링크가 된다.

그런데 프로그램이 만들어진 다음에 다른 컴퓨터에서 이것을 실행하기 위해서는 MSVCPRT.LIB가 필요한 것이 아니고, MSVCP80.DLL이 필요하다.

내가 생각할때 이 두 파일의 차이는 '개발자용'과 '사용자용'의 차이이다.

MSVCPRT.LIB는 Visual Studio를 설치해야만 제공되는 '개발자용' 라이브러리인 반면, MSVCP80.DLLMicrosoft Visual C++ 2005 Redistribution Package SP1 (x86)을 설치하면 Windows/WinSxS 폴더에 자연스럽게 설치가 되는 DLL이다. 즉, '사용자가 프로그램을 돌리기 위해서 배포되는 DLL'이다.

추가로 MSDN에서 주의를 요하는 부분은 프로그램을 작성할 때 동적으로 라이브러리를 링크하는 DLL과 동적으로 라이브러리를 링크하는 DLL 혹은 프로그램이 덩어리로 묶여서 실행될 때 발생할 수 있는 문제점을 지적하고 있다.

물론 정적으로 링크된 라이브러리가 홀로 사용된다면 아무 문제 없겠지만 DLL 간에 데이터 전송이나 호출이 발생하게 되면 링크된 라이브러리가 반드시 일치한다는 보장이 없기 때문에 문제가 될수도 있다는 것을 말하고 있다.

따라서 왠만하면 모든 것을 동적으로 링크하는게 좋다 이말이군... 업데이트하기에도 좋고, 일관성도 있고... 그렇겠군. :)

결론적으로 말하자면,

1. Visual Studio 2005는 Multi Thread로 코드를 작성하는 것만 지원한다.
2. 배포를 목적으로 한다면 반드시 /MD 옵션을 사용하라.
3. 설치할 컴퓨터에 Visual Studio가 설치되어 있지 않다면 Redistribution Package 를 다운 받아서 설치하라.
4. 되도록이면 작성하는 모든 프로그램 및 DLL은 /MD 옵션으로 통일하라.
posted by 대갈장군

댓글을 달아 주세요

  1. 뭐.. 평소 가지고다니는 소스가 포터블이다보니...
    동적 만세라고 말할 수 있나요...ㄷㄷ

  2. 네. 마이크로소프트가 추천하는 것은 동적으로 연결하라는 것 같아요... 맘 같아선 전부 파일 한개에 넣어 버리고 싶지만... :)

  3. 음, 전...봐도봐도봐도 뭐가뭔지 모르니..
    큰코를 다칠수도 없겠습니다. ㅋㅋ

    장군님, 즐거운 하루 잘 보내고 계신가욤?^^

  4. 대갈장군 2008.11.01 18:02  Addr Edit/Del Reply

    오늘은 즐거웠는데 내일이 문제입니다. 차를 타고 제법 이동해야 하는데 운전을 제가 꼭 해야 해서 피곤할 것으로 예상이 됩니다. 헤헤.. 그래봐야 명이님의 초콜렛 신공에 비하면 별것 아니지만요. :)

  5. 2011.12.20 05:52  Addr Edit/Del Reply

    비밀댓글입니다

  6. 2012.03.18 21:07  Addr Edit/Del Reply

    비밀댓글입니다

  7. /MD 를 사용했는데 아예 디버그가 안되네요...
    빌드만 하면 .exe파일이 생성되지도 않고...
    어떡해야하죠?

    • Favicon of https://diehard98.tistory.com BlogIcon 대갈장군 2015.02.09 13:25 신고  Addr Edit/Del

      빌드를 했는데 exe가 없다면 라이브러리를 생성하는 경우이거나 exe 파일이 다른 곳에 생성되었을 확률이 높습니다. 일반적으로 소스 코드가 있는 폴더에서 멀리 않은 곳에 Debug 나 Release 라는 이름의 폴더로 생성됩니다. 주로 소스 코드 바로 상위 폴더에 생성되죠. 한번 확인해 보시는 것이... 그리고 프로젝트 속성에 가 보시면 어디에 exe 파일이 생성되는지도 알수 있습니다.

  8. 재배포 없이 링크를 하려면 /MT로 하는 것이 좋은 경우가 많더라고요.

  9. 10년 전 게시물에서 지혜를 얻고 갑니다. 좋은 글 써 주셔서 감사합니다.