Programmm ist auf anderen Rechnern nicht lauffähig



  • Hallo,

    Ich bin ein Anfänger in Sachen C++ und hoffe, dass das hier das passende Unterforum ist.

    Ich hab ein einfaches tic-tac-toe Spiel programmiert, als Konsolenanwendung.
    Funktioniert auch soweit alles auf meinem Rechner.
    Ich verwende Eclipse mit dem MinGW Compiler unter Windows XP.

    Wenn ich das Programm aber auf einem anderen PC ausführen will bekomme ich folgende Fehlermeldung:

    Die Anwendung konnte nicht gestartet werden, weil libgcc_s_dw2-1.dll nicht gefunden wurde.
    Neuinstallation der Anwendung könnte das Problem beheben.

    Ich hab natürlich schon Google zu dem Thema befragt und denke, dass es an der Einstellung des Linkers liegt (ob statisch oder dynamisch gelinkt wird).
    Die verwendeten Header sind übrigens iostream und windows.h

    Aber ich hab überhaupt keine Ahnung, wie das funktioniert mit dem linken oder wo man das einstellen kann oder ob das überhaupt das Problem ist.
    Weiß vielleicht jemand eine Lösung?

    Vielen Dank schonmal!



  • Ich hatte das Problem auch schon mal, die .dll wird bei mir durch eine Abhängigkeit zu Qt benötigt. Im 'bin' oder 'lib' Ordner von Qt (aber auch im MinGW-Ordner) habe ich diese .dll gefunden und mit zur Executable gelegt. Da es damals nur ein schnell gehackter Prototyp war, habe ich mich nicht wirklich mit den richtigen Ursachen auseinandergesetzt. Falls Du das tust kannst Du ja mal hier ne Zusammenfassung geben 😉



  • Ja, so funktioniert das!
    Nachdem ich libgcc_s_dw2-1.dll in den Ordner kopiert hab hat noch libstdc++-6 gefehlt, jetzt läuft es.

    Ich such aber trotzdem noch eine Methode, wie das nur mit einer einzelnen .exe Datei geht.



  • Eigentlich sollte es ohne zusätzliche dlls gehen, wenn du nur eine Konsolenanwendung mit <iostream> und der WinAPI hast.
    Nimmst du auch die Release-Version deines Programmes?



  • Ja, aber es funktioniert weder mit der Release- Version noch mit der Debug- Version.





  • Cool, es funktioniert 😃
    Vielen Dank für die Links.

    Das Problem war tatsächlich das mit dem statischen linken.
    Ich hab es jetzt folgendermaßen "von Hand" compiliert:

    g++ -o TicTacToe.exe -static TicTacToe.cpp

    und es funktioniert wunderbar.
    Jetzt muss ich nur noch rausfinden, wie ich das eclipse beibring...



  • Das geht in der Makefile, dort steht der Befehl den Eclipse zum Kompilieren verwendet.



  • Beachte, dass du beim statisches Linken den Quellcode deines Tic Tac Toe Programms mitliefern musst.
    Immerhin steht AFAIK die libc des GNU Compilers unter der LGPL Lizenz.



  • LGPL schrieb:

    Beachte, dass du beim statisches Linken den Quellcode deines Tic Tac Toe Programms mitliefern musst.
    Immerhin steht AFAIK die libc des GNU Compilers unter der LGPL Lizenz.

    Nein.

    1. Es gibt eine explizite Ausnahme für die GCC-Runtime: https://www.gnu.org/licenses/gcc-exception-faq.html

    2. Solche Verpflichtungen beziehen sich nur auf Programme, die man veröffentlicht und "vertreibt". Für den Privatgebrauch oder
    auch für den firmeninternen Gebrauch darf man erstmal machen was man will - in diesem Fall ist man "Benutzer", und die
    Philosophie hinter den GPL-Lizenzen ist, dem "Benutzer" alle Freiheiten zu lassen.

    3. Statisches Linken von LGPL-Bibliotheken ist sehr wohl möglich, ohne den eigenen Code ebenfalls unter LGPL zu stellen.
    Das ist allerdings etwas komplizierter, da ein paar zusätzliche Regeln zu beachten sind1. Aus diesem Grund wird fast
    ausschliesslich dynamisches Linken verwendet, wordurch sich das Missverständnis, die LGPL verbiete statisches Linken mit
    Code, der unter einer inkompatiblen Lizenz steht, hartnäckig hält.

    1Die LGPL verlangt, dass der Benutzer in seinem Recht, die unter LGPL stehenden Biblotheken frei zu veändern, nicht
    eingeschränkt werden darf. Die LGPL-Teile der vertriebenen Software müssen für den Benutzer frei austauschbar sein.
    Das ist am einfachsten mit dynamischem Linken zu bewerkstelligen, in diesem Fall entfällt auch die Verpflichtung, den
    unter LGPL stehenden Quellcode der Bibliotheken mitzuliefern. Aber auch statisches Linken ist möglich, ohne den Quellcode
    des eigenen Programms ebenfalls unter LGPL zu veröffentlichen:
    In diesem Fall kann man z.B. die kompilierten Objektdateien oder ein Archiv aus Objektdateien ("statische Bibliothek")
    des eigenen Programms, sowie den Quellcode der unter LGPL stehenden Bibliothek zur Verfügung stellen, zusammen
    mit einer Anleitung wie diese zu einem vollständigen Programm zu verlinken sind. Auch damit genügt man der LGPL2,
    wenn auch weniger bequem als "dynamisch".

    2Zumindest die LGPL 2.1 ist diesbezüglich unter Punkt 6a sehr eindeutig, in den 3er-Version ist das leider nicht ganz so klar
    formuliert. Man beachte das "as object code and/or source code". Das mit dem "object code" ist das was ich oben beschrieben habe.

    Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used
    in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the
    complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and
    then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of
    definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)



  • StefanP schrieb:

    g++ -o TicTacToe.exe -static TicTacToe.cpp

    -static-libgcc und -static-libstdc++ tun es übrigens auch. Mit -static wird der Linker versuchen,
    sämtliche Bibliotheken statisch zu linken. Das ist nicht immer das, was man möchte.

    Anekdote am Rande: Die fehlende DLL ist übrigens das GCC-Äquivalent zu fehlenden "msvcp*.dll"
    und "msvcr*.dll"-Dateien - einem Problem dem wahrscheinlich fast jeder irgendwann schonmal begegnet ist 😉


Anmelden zum Antworten