Visual Studio Express 2005를 사용하여 완전히 정적으로 연결된 .exe를 만들려면 어떻게합니까?


109

현재 선호하는 C ++ 환경은 무료이며 대체로 우수한 Microsoft Visual Studio 2005 Express 에디션입니다. 때때로 나는 기분 좋은 결과로 다른 사람들에게 릴리스 .exe 파일을 보냈습니다. 그러나 최근에 나는 만족스러운 결과가 내가 원하는 더 많은 운에 근거한 것이라는 불안한 발견을했다. 오래된 (2001 년 빈티지, 꼼꼼하게 업데이트되지 않은) XP 상자에서 이러한 프로그램 중 하나를 실행하려고하면 "시스템에서 x.exe를 실행할 수 없습니다"(또는 이와 유사한) 메시지 만 표시되었습니다.

일부 인터넷 검색에서이 도구 세트를 사용하면 정적 링크를 지정해도 실제로 추가 .dll 파일 (msvcm80.dll 등)에 의존하는 간단한 hello-world.exe가 생성됩니다. 믿을 수 없을 정도로 정교한 버전 계획 시스템 (매니페스트 파일 누구?)은 정확한 .dll 버전 없이는 .exe를 실행할 수 없습니다. 저는이 물건을 원하거나 필요로하지 않습니다. 저는 단지 가장 낮은 공통 분모 인 Win32 작업을 수행하고 모든 오래된 win32 OS에서 실행되는 구식 자체 포함 .exe를 원합니다.

기존 도구 세트로 내가 원하는 것을 할 수 있는지 아는 사람이 있습니까?

감사합니다.

답변:


126

C- 런타임의 경우 프로젝트 설정으로 이동하여 C / C ++를 선택한 다음 '코드 생성'을 선택합니다. '런타임 라이브러리'설정을 '다중 스레드 dll'대신 '다중 스레드'로 변경하십시오.

다른 라이브러리를 사용하는 경우 동적으로 연결된 CRT를 명시 적으로 무시하도록 링커에 지시해야 할 수 있습니다.


"다른 라이브러리를 사용하는 경우 동적으로 연결된 CRT를 명시 적으로 무시하도록 링커에 지시해야 할 수 있습니다." 최근에이 문제에 부딪 혔습니다. 나는 wxWidgets 앱을 빌드하고 있었는데, 동일한 코드 생성 수정으로 wxWidgets 라이브러리를 다시 빌드해야한다는 것을 알았습니다
Bill Forster

6
남자 300자는 많지 않습니다. 위의 설명이 명확하지 않은 경우 문제는 .cpp 파일과 라이브러리 .cpp 파일 모두 '다중 스레드 dll'대신 '다중 스레드'가 있어야한다는 것입니다. 그렇지 않으면 링크 오류가 발생할 수 있습니다.
Bill Forster

이로 인해 아무 작업도하지 않으려는 힙 관리와 관련된 수많은 문제가 발생합니다.
Edward Strange

CRT 라이브러리의 경우 VS는 / MD 및 / MT 옵션을 제공합니다. 하지만 일반적으로 libX.lib (내 라이브러리 또는 타사 라이브러리 일 수 있음)와 같이 다른 라이브러리를 정적으로 연결하는 것은 어떻습니까?
Kiran MN

4
나는 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. 빌드 유형을 변경할 다른 곳이 있습니까? @BillForster와 매우 유사한 wxWigets 애플리케이션을 구축하고 있습니다. 그래서 wxWidgets 를 다시 빌드 해야 합니까? 어떻게하나요?
Tomáš Zato-Monica 복원

18

Visual Studio 2010에서의 경험은 DLL이 필요하지 않도록 두 가지 변경이 필요하다는 것입니다. 프로젝트 속성 페이지에서 (솔루션 탐색기 창에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭) :

  1. 구성 속성-> 일반에서 "MFC 사용"필드를 "정적 라이브러리에서 MFC 사용"으로 변경합니다.

  2. 구성 속성-> C / C ++-> 코드 생성에서 "런타임 라이브러리"필드를 "다중 스레드 (/ MT)"로 변경합니다.

둘 다 필요한 이유가 확실하지 않습니다. 나는 이것을 사용하여 glut32.dll에 대한 종속성을 제거했습니다.

나중에 추가됨 : 구성을 변경하는 경우 "모든 구성"으로 변경해야합니다. --- 속성 창 상단에서 선택할 수 있습니다. 디버그 구성 만 변경하면 릴리스 구성에는 적용되지 않으며 그 반대의 경우도 마찬가지입니다.


1
이것은 Visual Studio 2013에서 작동하는 것처럼 보입니다. 구성 속성-> 일반-> 문자 집합을 "유니 코드 문자 집합 사용"으로 변경해야했습니다.
gnovice

4

나는 이와 동일한 종속성 문제를 겪었으며 VS 8.0 DLL (릴리스 전용! 디버그가 아님! --- 그리고 프로그램도 릴리스되어야 함)을 적절한 이름의 폴더에 포함 할 수 있음을 알고 있습니다. .exe가있는 상위 폴더 :

방법 : XCopy (MSDN)를 사용하여 배포

또한 동일한 정적으로 연결된 .exe에 C ++ 및 C 코드가 있어야하는 경우 문제가 발생할 수 있습니다. 올바른 libXXX.lib를 무시한 다음 동적으로 연결 (DLL)해야만 해결할 수있는 링커 충돌이 발생하기 때문입니다. .

마지막으로, 다른 도구 세트 (VC ++ 6.0)를 사용하면 Windows 2000 이상에 올바른 DLL이 설치되어 있으므로 "작동"합니다.


1

Jared의 대응과 관련하여 Windows 2000 이상을 사용한다고해서 반드시 문제가 해결되는 것은 아닙니다. Rob의 응답은 작동하지만 Windows 업데이트가 이와 같이 빌드 된 응용 프로그램을 패치 할 수 없기 때문에이 수정으로 보안 문제가 발생할 수 있습니다.

다른 게시물에서 Nick Guerrera는 빠르게 설치되고 Visual Studio와 독립적 인 Visual C ++ 런타임 재배포 가능 패키지를 애플리케이션과 함께 패키징 할 것을 제안합니다.


2
재배포 가능 패키지를 패키징하는 것이 선호되는 솔루션 인 것처럼 보이지만 재배포 가능 설치 프로그램을 실행하려면 관리자 권한이 필요합니다. 관리자가 아닌 사용자가있는 경우 실행 가능한 옵션이 아닙니다.
Kevin Condon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.