Visual Studio Express 2005를 사용하여 완전히 정적으로 연결된 .exe를 만들려면 어떻게합니까? 중 하나를 실행하려고하면 “시스템에서

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

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

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

감사합니다.



답변

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

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


답변

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

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

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

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

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


답변

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

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

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

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


답변

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

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