2012-12-24 16 views
5

Przeczytałem dwa poniższe pytania: Which runtime libraries to ship? i License of runtime libraries included in GCC? - oba były bardzo pomocne, ale nie do końca tego, czego szukałem.Wymagania dotyczące bibliotek środowiska wykonawczego wysyłania/bibliotek DLL

Zawsze pisałem programy do użytku na mojej maszynie, co nigdy nie sprawiało mi żadnych problemów, ale teraz chcę uruchomić oprogramowanie na innych komputerach i jestem nieufny wobec wymagań środowiska wykonawczego.

EDYCJA: Zobacz poniżej przykład, to było mylące.

szczególności, jeśli napisać program w C++ na komputerze z systemem Windows, skompilowane z gcc poprzez MinGW i chcesz go uruchomić na innym komputerze:

  • Czy muszę wysłać libstdC++. dll z mojego programu?
  • Czy ten pojedynczy plik (zakładam, że znajduje się w katalogu wykonywalnym) wystarczający do uruchomienia programu?

Również identyczny przykład, z wyjątkiem tego, że jest to program typu Objective-C. Czy wysyłanie pliku libobjc.dll do drugiego komputera jest wystarczające, aby umożliwić prawidłowe wykonanie programu?

Jestem przyzwyczajony do uruchamiania programów na komputerach z zainstalowanymi narzędziami programistycznymi itp., Ale teraz zamierzam uruchomić je na komputerach ogólnego przeznaczenia (np. Przyjaciołach, kolegach itp.) I nie jestem całkiem pewnie, co robić!


EDIT: W odpowiedzi na gmach „s odpowiedź, czuję, że powinienem wyjaśnić, co to ja szukam. Wiem, jak zidentyfikować niezbędne biblioteki DLL (/ dylibs, itp.), Których używają moje programy (chociaż jestem przyzwyczajony do robienia tego ręcznie, nie słyszałem o żadnym z narzędzi). Moje pytanie było bardziej "Co mam teraz zrobić?"

Bardziej ogólny przykład jest prawdopodobnie potrzebne:

Powiedzmy Napisałem program, który ma wyrazić sprzeciw pliki pochodzące z C++, C i/lub C Objective-(2) Kod. Użyłem kodu Windows API, który został skompilowany pomyślnie przy użyciu gcc MinGW. Mam również niestandardową bibliotekę DLL, którą napisałem w Visual Studio (C++).

Zidentyfikowaliśmy biblioteki DLL, których mój program będzie używał w czasie wykonywania (jednym z nich może być plik libobjc.dll GCC, nie jestem pewien, czy to/powinienoby mieć wpływ na maszynę z systemem Windows, ale chcę to zrobić tak ogólny, jak to możliwe) - "wymagania wstępne DLL".

chciałbym go uruchomić na komputerach z moich kolegów, z których większość systemem Windows 7, ale niektórzy teraz uruchomić Windows 8. Już od samego początku w trosce o kompletność:

  • muszę przetransferować wymagające biblioteki DLL do komputerów moich kolegów?
  • W jakim katalogu powinienem je umieścić? (katalog exe/katalog systemowy?)
  • Czy na miejscu obecność tych bibliotek DLL pozwoli na prawidłowe wykonanie programu? (Zakładając, że wie, gdzie je znaleźć)
  • Czy są jakieś inne pliki, które powinny zostać przesłane z bibliotekami DLL?

Zasadniczo staram się określić cały proces myślenia w celu opracowania i uruchomienia aplikacji na innej maszynie pod względem wymagań systemowych.

Odpowiedz

4

Podczas ładowania bibliotek DLL, pierwszym miejscem, w którym Windows wygląda, jest katalog, w którym znajduje się plik exe. Dlatego prawdopodobnie będzie działać dobrze, aby umieścić tam biblioteki DLL.

Jednak dla bibliotek DLL firmy Microsoft rozsądniej jest poprosić kolegę o zainstalowanie środowiska wykonawczego Visual C++, które jest pakietem redystrybucyjnym firmy Microsoft. Najlepiej byłoby, gdybyś zrobił instalator używając czegoś takiego jak WiX i zainstalowałby to dla ciebie, ale możesz po prostu powiedzieć swojemu koledze, żeby to zrobił.

Pamiętaj, aby dołączyć plik licencji do oprogramowania, jeśli dołączasz biblioteki DLL z gcc, ponieważ GPL tego wymaga.

+1

Dla aplikacji sklepu Win8 patrz: http://blogs.msdn.com/b/vcblog/archive/2012/09/28/10354327.aspx –

3

libstdC++ niekoniecznie jest wystarczająca. Prawie na pewno potrzebujesz również libgcc, ale rzeczywiste zależności mogą się różnić w zależności od konkretnej aplikacji.

Najlepszym sposobem, aby ustalić, co należy wysłać z aplikacją, jest załadowanie pliku EXE do programu takiego jak Dependency Walker.

Jako przykład skompilowałem program testowy C++, który po prostu wypisuje std :: string. As you can see, to zależy bezpośrednio od dwóch modułów innych niż te, które pochodzą z Windows; libgcc_s_dw2-1.dll oprócz libstdc++-6.dll.

Należy pamiętać o rozwinięciu drzewa pod każdą biblioteką DLL, aby upewnić się, że nie ma żadnych innych zależności (jeśli A zależy od B, B może zależeć od C, nawet jeśli A nie zależy bezpośrednio od C) .

Jeśli martwisz się i chcesz uzyskać najsilniejsze zapewnienia, możesz zainstalować system Windows w maszynie wirtualnej (VirtualBox jest bezpłatny) i przetestować aplikację w nim. Jeśli korzystasz z interfejsów API firmy Microsoft, możesz sprawdzić dokumentację MSDN, aby sprawdzić, z którą wersją systemu Windows zostały one wprowadzone i upewnić się, że jest zgodna z docelową minimalną wersją systemu Windows.

Update: Jako xtofl Wskazuje na to nie pokryje biblioteki załadowane dynamicznie przy użyciu LoadLibrary. Jeśli chcesz objąć tę bazę, użyj Monitora procesu, aby sprawdzić, jakie pliki DLL są dotykane podczas uruchamiania aplikacji. (Dodaj kryterium "Ścieżki obrazu" ze ścieżką do pliku EXE, aby nie zostać zalanym). Ma to tę dodatkową zaletę, że obejmuje wszystkie pliki, wpisy rejestru itp., Od których zależy twoja aplikacja, a nie tylko biblioteki DLL.

+0

'zależy' przyniesie pliki binarne, które są statycznie ładowane. Pliki dll załadowane np. 'LoadLibrary (...)' zostanie pominięte, ale i tak są one pod Twoją kontrolą. – xtofl

+1

Najlepszym sposobem nie jest używanie zależy. Najlepszym sposobem jest poznanie zależności między aplikacjami od podstaw. Czytanie dokumentacji kompilatora będzie potrzebne. –

+0

Możesz również uruchomić aplikację z poziomu Dependency Walker (Profile-> Start Profiling). Następnie zaktualizuje widok do tych bibliotek, które są faktycznie ładowane w środowisku wykonawczym. –

Powiązane problemy