Kompilierte exe nicht auf anderen Rechner ausführbar?
-
Hallo,
ich weiß dieses Thema ist nicht gerade neu und wurde bestimmt schon oft besprochen, aber ich konnte bis jetzt keine Lösung finden..
Ich benutze das MS Visual Studio 2008 und hab dort ein C++ Projekt erstellt.
Als zusätzliche Bibliotheken benutzen ich QT und OpenCV.Ich habe es als Release kompiliert und sämtliche *.dll's die benutzt werden in das Verzeichnis gepackt, in der sich die *.exe befindet.
Wenn ich das Programm nun auf einem anderen Rechner ausgühren möchte (auf dem keine Entwicklungsoberfläche installiert ist) dann bekomme ich diesen Fehler:
"Diese Anwendung konnte nicht gestartet werden, weil die Anwendungskonfiguration nicht korrekt ist. Zur Problembehebung sollten Sie die Anwendung neu installieren."
Egal was ich versucht habe, es ist immer das gleiche.

Kann mir jemand Helfen?
-
Du musst vcredist_x86.exe auf dem Zielrechner installieren oder statisch linken...
http://blog.kalmbach-software.de/2008/03/03/screencast-statically-link-to-the-c-runtime-to-prevent-vcredist-and-overcome-application-configuration-problems/
http://www.kalmbach-software.de/screencasts/VC2008EE-StaticLinkCRT/Siehe auch:
http://blog.kalmbach-software.de/2009/05/27/deployment-of-vc2008-apps-without-installing-anything/
-
Programm für solche Angelegenheiten: Dependency Walker
Hol dir das Tool und starte dein Programm damit. Das Tool zeigt dir an wo es hakt.
-
Danke für die schnelle Antwort.
Genau das habe ich schon versucht, nach dem ich die Einstellungen vorgenommen habe, kann ich das Projekt nicht mehr erfolgreich erstellen, weil folgender Fehler dann erscheint:
LIBCMT.lib(wwincrt0.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "_wWinMain@16".
-
@Flockig:
auch das habe ich versucht.
Der dependency walker zeigt mir zwar die fehlenden Bibliotheken an, aber nachdem ich alle dll's auf dem Rechner kopiert habe (siehe erster Beitrag) kommt trotzdem die Fehlermeldung...
-
Dann hast Du noch was anderes in Dein Eigenschaften umgestellt... z.B. im Linker das "Subsystem... stelle es wieder auf "Console" und es geht...
-
aaah ok
nun läuft es.Aber ich möchte das eigentlich ohne Konsole?
-
Dann ändere Dein "main" nach "WinMain" und stelle es wieder auf /WINDOWS um...
-
du meinst die Funktion
int main(int argc, char* argv[])in
int WinMain(int argc, char* argv[])umbenennen?
Funktioniert nicht..
1>.\main.cpp(6) : warning C4007: 'WinMain': '__stdcall' muss angegeben werden
1>.\main.cpp(6) : error C2731: 'WinMain': Überladen der Funktion nicht möglich
1> .\main.cpp(5): Siehe Deklaration von 'WinMain'
-
und bei
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)kommt wieder der Fehler:
error LNK2001: Nicht aufgelöstes externes Symbol "_wWinMain@16".

-
Anne001 schrieb:
und bei
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)kommt wieder der Fehler:
error LNK2001: Nicht aufgelöstes externes Symbol "_wWinMain@16".

Weil Du LPSTR verwendets und ein Unicode Programm hast. Folgerichtig muss es einen Fehler geben.
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
-
Ja und wie löse ich das Problem?
-
Mach aus "main(...)" =>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
-
Hallo,
also mit _tWinMain funktionierts auch nicht,
allerdings mit wWinMain klappt alles auch mit Unicode..jetzt konnte ich das Projekt problemlos auf nem anderen Rechner ausführen, sehr schön!
Aber ich habe ein anderes Projekt wo dies noch nicht klappt.
Habe alles dort alles ganz genauso gemacht und dort kamen dann die Linker fehler:MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
Also habe ich die MSCRTD zur ignorListe hinzugefügt und er konnte es korrekt linken.
Allerdings kam dann wieder der übliche Fehler wenn ich es auf einem anderen Rechner ausführen wollte.In diesem Projekt benutze ich zusätzlich openCV und qextseriellport, aber daran dürfte es doch nicht liegen oder??
-
Kann es sein, dass Du Bibliotheken benutzt, die nicht mit Deinem Compiler erzeugt wurden?
-
ja, naja eigentlich nicht.
also ich habe den übeltäter gefundenes liegt am qexserialport (comport für qt)
das habe ich aber mit dem gleichen compiler kompiliert:
visual studio konsole auf...qmake...dann nmake und dann war die lib dazu da..wenn ich den seriellenport nicht verwende funktioniert alles...
wie bekomme ich das den hin?
muss ich bei qmake oder nmake bestimmte parameter angeben?