Jak utworzyć w pełni statycznie połączony plik .exe z programem Visual Studio Express 2005?

109

Obecnie preferowanym przeze mnie środowiskiem C ++ jest darmowa iw dużej mierze doskonała edycja Microsoft Visual Studio 2005 Express. Od czasu do czasu wysyłałem innym osobom pliki .exe z zadowalającymi wynikami. Jednak ostatnio dokonałem niepokojącego odkrycia, że ​​zadowalające wyniki były oparte na większym szczęściu, niż bym chciał. Próba uruchomienia jednego z tych programów na starym (rocznik 2001, nie skrupulatnie aktualizowanym) pudełku XP dała mi tylko nieprzyjemny komunikat „System nie może uruchomić x.exe” (lub podobny).

Niektórzy googlowie ujawnili, że w przypadku tego zestawu narzędzi, nawet określenie statycznego linku powoduje, że prosty plik hello-world.exe faktycznie polega na dodatkowych plikach .dll (msvcm80.dll itp.). Niezwykle rozbudowany system schematów wersji (czy ktoś manifestuje pliki?) Nie pozwoli więc na uruchomienie .exe bez dokładnie odpowiednich wersji .dll. Nie chcę ani nie potrzebuję tych rzeczy, po prostu chcę staromodnego, samodzielnego pliku .exe, który wykonuje tylko operacje Win32 z najniższym wspólnym mianownikiem i działa na każdym starym systemie operacyjnym win32.

Czy ktoś wie, czy można zrobić to, co chcę zrobić z moim istniejącym zestawem narzędzi?

Dziękuję Ci.

Bill Forster
źródło

Odpowiedzi:

126

W przypadku środowiska wykonawczego C przejdź do ustawień projektu, wybierz C / C ++, a następnie „Generowanie kodu”. Zmień ustawienie „biblioteki uruchomieniowej” na „wielowątkowa” zamiast „wielowątkowej biblioteki dll”.

Jeśli używasz innych bibliotek, może być konieczne poinstruowanie konsolidatora, aby jawnie zignorował dynamicznie połączony CRT.

Rob Walker
źródło
„Jeśli używasz innych bibliotek, może być konieczne poinformowanie konsolidatora, aby wyraźnie zignorował dynamicznie połączony CRT”. Niedawno natknąłem się na ten problem. Budowałem aplikację wxWidgets, stwierdziłem, że muszę przebudować biblioteki wxWidgets z tą samą modyfikacją generowania kodu
Bill Forster,
6
Człowiek 300 znaków to niewiele. W przypadku, gdy powyższy komentarz jest niejasny, problem polega na tym, że zarówno pliki .cpp, jak i wszystkie pliki .cpp biblioteki muszą mieć „wielowątkowe” zamiast „wielowątkowych dll”, w przeciwnym razie mogą wystąpić błędy linków.
Bill Forster,
To wprowadza wiele problemów dotyczących zarządzania stertą, z którymi prawdopodobnie nie chcesz mieć nic wspólnego.
Edward Strange,
W przypadku bibliotek CRT VS udostępnia opcje / MD i / MT. A co z łączeniem innych bibliotek w sposób statyczny - powiedzmy libX.lib (może to być moja własna biblioteka lub biblioteka innej firmy)?
Kiran MN
4
Rozumiem error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Czy jest inne miejsce, w którym można zmienić typ kompilacji? Buduję aplikację wxWigets, podobnie jak @BillForster. Czy będę musiał przebudować wxWidgets? W jaki sposób mogę to zrobić?
Tomáš Zato - Przywróć Monikę
18

Z mojego doświadczenia w Visual Studio 2010 wynika, że ​​potrzebne są dwie zmiany, aby nie potrzebować bibliotek DLL. Na stronie właściwości projektu (kliknij prawym przyciskiem myszy nazwę projektu w oknie Solution Explorer):

  1. W obszarze Właściwości konfiguracji -> Ogólne zmień wartość w polu „Użyj MFC” na „Użyj MFC w bibliotece statycznej”.

  2. W obszarze Właściwości konfiguracji -> C / C ++ -> Generowanie kodu zmień pole „Biblioteka środowiska wykonawczego” na „Wielowątkowy (/ MT)”

Nie wiem, dlaczego oba były potrzebne. Użyłem tego do usunięcia zależności od glut32.dll.

Dodano później: wprowadzając te zmiany w konfiguracjach, należy ustawić je na „Wszystkie konfiguracje” - można to wybrać u góry okna Właściwości. Jeśli wprowadzisz zmianę tylko w konfiguracji debugowania, nie będzie ona miała zastosowania do konfiguracji wydania i na odwrót.

Sam Buss
źródło
1
Wydaje się, że działa to w Visual Studio 2013 z jednym małym dodatkiem: musiałem zmienić Właściwości konfiguracji -> Ogólne -> Zestaw znaków na „Użyj zestawu znaków Unicode”.
gnovice
4

Miałem ten sam problem z zależnościami i wiem również, że możesz dołączyć biblioteki DLL VS 8.0 (tylko wydanie! Nie debugowanie! --- i twój program też musi być wydany) w folderze o odpowiedniej nazwie, w folder nadrzędny z plikiem .exe:

Instrukcje: wdrażanie przy użyciu XCopy (MSDN)

Należy również pamiętać, że wszystko pójdzie nie tak, jeśli potrzebujesz kodu C ++ i C w tym samym statycznie połączonym pliku .exe, ponieważ otrzymasz konflikty konsolidatora, które można rozwiązać tylko przez zignorowanie prawidłowego libXXX.lib, a następnie dynamiczne połączenie (biblioteki DLL) .

Wreszcie, z innym zestawem narzędzi (VC ++ 6.0) rzeczy „po prostu działają”, ponieważ Windows 2000 i nowsze mają zainstalowane prawidłowe biblioteki DLL.

Jared Updike
źródło
1

Jeśli chodzi o odpowiedź Jareda, posiadanie systemu Windows 2000 lub nowszego niekoniecznie rozwiąże problem. Odpowiedź Roba działa, jednak możliwe jest, że ta poprawka wprowadza problemy z bezpieczeństwem, ponieważ aktualizacje systemu Windows nie będą mogły łatać aplikacji zbudowanych jako takie.

W innym poście Nick Guerrera sugeruje pakowanie pakietu redystrybucyjnego Visual C ++ Runtime Redistributable z aplikacjami, które instalują się szybko i są niezależne od Visual Studio.

bunkerdive
źródło
2
Chociaż wydaje się, że preferowanym rozwiązaniem jest pakowanie pakietu redystrybucyjnego, do uruchomienia instalatora redystrybucyjnego potrzebne są uprawnienia administratora. To nie jest opłacalna opcja, jeśli masz użytkowników niebędących administratorami.
Kevin Condon