2009-10-17 13 views
9

Po napisaniu aplikacji CGI w programie Visual Studio 2008 i debugowaniu jej lokalnie, przesłałem ją do systemu operacyjnego Windows Server 2003, w którym natychmiast się nie uruchomiła.Uruchamianie plików binarnych C++ bez redystrybucji środowiska wykonawczego (Server2k3, XPSP3)

mam zgadywać muszę zainstalować nędznego Runtime Dystrybucyjnego, ale po przeczytaniu tego:

http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

Zastanawiam się, czy to ma większy sens, aby zignorować ten obok siebie rzeczy i po prostu re-write Aplikacja.

Zgaduję, że Windows Server 2003 nie ma wersji MSCRVT, której potrzebuję? Czy system Windows Server 2003 to posiada?

Jeśli chodzi o wdrażanie grubych klientów, chciałbym rozpowszechniać wymagane biblioteki dll z moją aplikacją. Co oni zakładają, że po prostu INCLUDE iostream, sstream, string?

Czy zmienia się znacząco, jeśli dodaję plik windows.h?

Dodano:

Używając przełącznika/MT zalecane poniżej

C/C++ -> Code Generation -> Runtime Library -> Wielowątkowym (/ MT)

(Prawdopodobnie będziesz potrzebować zrobić clean:

Build -> Clean

aby uniknąć komunikatu o błędzie

"Zapisanie zaktualizowanego manifestu w pliku" nie powiodło się)

Nadęty mój app od 38k do 573k. To, co nazywam Significant (wyobraź sobie, jeśli to była twoja pensja). Ponieważ wiele instancji tej aplikacji będzie stale ładowanych i rozładowywanych (wymagając cennej pamięci i zasobów procesora), chciałbym znaleźć lepsze (mniejsze) rozwiązanie.

Rozumiem, że nie jest to ważne w dzisiejszych wielu sytuacjach, a nie w centrum uwagi wielu programistów, stąd tendencja do uruchamiania aplikacji .NOT i 60 MB, ale właśnie to chcę zrobić.

Dodano:

Po usunięciu debugowanie, aby projekt do kompilacji:

Project -> Propeties -> C/C++ -> preprocesor -> preprocesora Definicje (usunąć DEBUG;)

rozmiar został zmniejszony do 300 tys. i będzie działał.

Dodano: Jak sugeruje Chris Becke poniżej, kopiowanie: msvcm90.dll msvcp90.dll Msvcr90.dll Microsoft.VC90.CRT.manifest do katalogu aplikacji zapewni cały czas pracy potrzebny.

Korzystanie z programu Visual Studio 6 zostało zasugerowane kilka razy, ale nie obsługuje systemu Vista (lub Windows 7, który zakładamy). Inne rozwiązania, które nie wymagają dystrybucji w środowisku wykonawczym, prawdopodobnie byłyby dla mnie MASM, a nawet podstawą Basic.Niestety, pokonuje to cel używania języka OOP wysokiego poziomu, takiego jak C++.

Tak długo, jak muszę wymagać instalacji redystrybucji C++, kompromis jest dodatkowy 260k. Ów dopuszczalne

+0

Czy * co * zmienia się znacząco? Niemal wszystko, co zbudujesz przy pomocy VS2008, będzie wymagało również instalacji w środowisku wykonawczym. – Joe

+0

Będziesz potrzebował środowiska wykonawczego niemal bez względu na wszystko. Twój wybór znajduje się w * jak * możesz to uwzględnić. Najwygodniejszą metodą jest użycie statycznie połączonej wersji. Wtedy nie musisz w ogóle dystrybuować osobnej biblioteki dll. W przeciwnym razie masz pół miliona sposobów dystrybucji biblioteki dll. Począwszy od bardzo skomplikowanej rzeczy, która wymaga przeczytania 15 stron dokumentacji, po prostu umieszczenie jej w folderze o poprawnej nazwie w folderze głównym aplikacji, co jest całkiem łatwe w zarządzaniu. – jalf

+0

Nie jestem pewien, jak skuteczne byłoby to, ale spróbuj błądzić z opcjami kompilatora/linkera. Było kilka czynników, które wpływały na rozmiar pliku wykonywalnego (coś na temat optymalizacji rozmiaru i usuwania nieużywanych rzeczy). –

Odpowiedz

6

Pełniejsze lista opcji:

  • Przepisz aplikację tak, że tam nie ma C/C++ Wykorzystanie w ogóle.
  • Przejście do programu Visual Studio 6 lub zestawu narzędzi opartych na mingw, takich jak Code :: Blocks - używają już rozproszonego pliku msvcrt.dll jako środowiska wykonawczego.
  • Zbuduj przy użyciu przełącznika/MT. To buduje niezbędne funkcje uruchomieniowe w twoim exe. Który to rozwali. Ale to wzdęcia (szczerze mówiąc) jest mniej ogólne niż ładowanie oddzielnych bibliotek dll.
  • Dystrybucja środowiska wykonawczego VS9 jako instalacji "prywatna sxs". Oznacza to skopiowanie zawartości C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT do tego samego folderu, co plik exe aplikacji. Jeśli zastosowałeś dodatek SP1, ten folder będzie zawierał środowisko wykonawcze SP1, ale twoja aplikacja będzie prosiła o środowisko wykonawcze RTM (zobacz rysunek). Dodaj _BIND_TO_CURRENT_CRT_VERSION do swoich projektów definiujących, przebudowujących i które powinny się same uporządkować.
  • Istnieje najwyraźniej vc_redist.exe, który można uzyskać dla VS9. Znajdź lub wymyślić MSI lub mojo instalatora wymagane do faktycznego zainstalowania powyższego zestawu (będącego treścią Microsoft.VC90.CRT) we współużytkowanym magazynie sxs.
+0

Dystrybucja działa w środowisku wykonawczym VS9. Zobacz omówienie powyżej –

9

Pozwól mi zmienić moją odpowiedź:

Masz kilka opcji:

1) Instalacja VC++ 2008 Runtime. Możesz download i instalatora dla nich. Moduły scalania dla nich są również dostępne.

2) Łącze statycznie ze środowiskiem wykonawczym (/ MT lub C/C++ -> Generowanie kodu -> Biblioteka środowiska wykonawczego: Wielowątkowe). Spowoduje to zwiększenie rozmiaru pliku wykonywalnego, ale nie będzie zależało od bibliotek DLL. Jeśli martwisz się rozmiarem, korzystaj tylko z biblioteki standardowej C lub korzystaj bezpośrednio z interfejsu API systemu Windows.

3) Użyj starszej wersji VC++. 2005 i wcześniej nie wymagało instalacji środowiska wykonawczego. Biblioteki Dll można umieścić w tym samym katalogu, co plik wykonywalny. Jeśli korzystasz z VC++ 6.0, środowiska wykonawcze będą instalowane we wszystkich wersjach systemu Windows, w przeciwnym razie musisz zainstalować je samodzielnie.

+0

Myślę, że masz na myśli Właściwości projektu -> C/C++ -> Generowanie kodu -> Biblioteka RUntime -> Wielowątkowy (/ MT) –

+0

Koder lub kodek? Haha ... prawdopodobnie masz rację, próbowałem zrobić to z pamięci. –

Powiązane problemy