C++ Programm auf einem Pc ausführen der kein Compiler instlliert hat!



  • Hi, kann mir jemand sagen wie ich ohne ein instllierten compiler z.B dev c oder borland c++ ein mit den vorherig genannten compilern erstelltes programm
    auf einem pc ausführen kann..

    also ich habe ein programm: 1.exe und möchte dieses öffnen auf einem pc der kein c++ programm instlliert hat..

    bei mir kommt ein fehler von einer fehlenden dll datei

    gruß

    sporty



  • bei mir gehts.



  • Du musst die CRT-Bibliotheken statisch linken. Meistens kannst du das in den Compiler-Optionen einstellen, welchen verwendest du denn?



  • falls du den C++ Builder von Borland meinst: siehe TOP 1 der FAQ des Unterforums zum C++ Builder



  • Badestrand schrieb:

    Du musst die CRT-Bibliotheken statisch linken. Meistens kannst du das in den Compiler-Optionen einstellen, welchen verwendest du denn?

    Wieso MUSS er statisch linken? Müssen muß er nichts. Er kann, wenn er will. Soll mal lieber auf dem Fremd-PC endlich die fehlen DLLs installieren, dann muß nicht jeder andauernd statisch linken. Ist eine ganz schlechte Angewohnheit hier im Forum, immer nur die bequemste Lösung zu nennen. Eigentlich sollte sich der Fragesteller mit dem Thema näher bescheftigen und dann entscheiden. Die CRT ist nämlich etwas essenzielles, das sollte eigentlich auf jedem PC drauf sein.



  • Artchi schrieb:

    Eigentlich sollte sich der Fragesteller mit dem Thema näher bescheftigen und dann entscheiden. Die CRT ist nämlich etwas essenzielles, das sollte eigentlich auf jedem PC drauf sein.

    Zumindest die Release-Version der CRT. Die Debug-Version ist ohne einen Compiler recht nutzlos (und darf afaik auch nicht frei weitergegeben werden).



  • Deswegen gibts für Enduser auch von MS extra Installer-Packete! Man muß die CRT nicht mal selber verteilen sondern einfach nur seinem Kunden/User den Link geben oder meinet wegen das Packet mitschicken (falls der User kein Internet hat).

    http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=de

    Ist nun wirklich kein Ding der Unmöglichkeit. 😉



  • Artchi schrieb:

    Badestrand schrieb:

    Du musst die CRT-Bibliotheken statisch linken. Meistens kannst du das in den Compiler-Optionen einstellen, welchen verwendest du denn?

    Wieso MUSS er statisch linken? Müssen muß er nichts.

    Ok, tut mir Leid, dann muss er halt, wenn er keine zusätzlichen DLLs oder Links mitliefern will 🙂

    edit: Meine Meinung: Aber bevor man die DLLs mitliefert, kann man auch gleich statisch linken. Der Link macht noch Sinn, allerdings werden die meisten Benutzer nicht wissen, ob sie die CRT schonmal installiert haben. Legt man die DLLs bei, ist das Päckchen doch wieder größer als mit statischem Linken, dann fällt der Vorteil wieder weg. Oder gibt's beim statischen Linken weitere Nachteile außer dass die exe ein Eckchen größer wird?



  • Artchi schrieb:

    Soll mal lieber auf dem Fremd-PC endlich die fehlen DLLs installieren, dann muß nicht jeder andauernd statisch linken. Ist eine ganz schlechte Angewohnheit hier im Forum, immer nur die bequemste Lösung zu nennen.

    Was soll denn von Nachteil sein am statischen Linken, solange die Anwendung nicht aus mehreren Modulen besteht oder eine gewisse Größe überschreitet? Daß eine Anwendung out-of-the-box funktioniert, ist zunächst in jeder Hinsicht vorteilhaft. Die meisten Anwender sind recht glücklich, nicht noch irgendwelche Runtime-Libraries herunterladen zu müssen, von Ungetümen wie dem .NET-Framework ganz zu schweigen.

    Artchi schrieb:

    Eigentlich sollte sich der Fragesteller mit dem Thema näher bescheftigen und dann entscheiden. Die CRT ist nämlich etwas essenzielles, das sollte eigentlich auf jedem PC drauf sein.

    Die CRT? In meinem %WINDIR%\system32-Verzeichnis befinden sich mindestens 13 CRT-verwandte Bibliotheken, darunter 8 von Microsoft (msvcirt.dll, msvcp50.dll, msvcp60.dll, msvcp71.dll, msvcr71.dll, msvcrt.dll, msvcrt20.dll, msvcrt40.dll) und 5 von Borland/CodeGear (cc3260mt.dll, cc3270.dll, cc3270mt.dll, cc3280.dll, cc3280mt.dll). Falls du dich nicht auf die C- und C++-RTLs beschränken willst, kämen z.B. für Delphi noch rtl60.bpl, rtl70.bpl und rtl100.bpl sowie borlndmm.dll hinzu. Und von ATL, MFC, VCL etc. ist noch gar nicht die Rede.

    (Edit: Ich vergaß, die im WinSxS-Verzeichnis untergebrachten DLLs namens msvcm80.dll, msvcrt80.dll, msvcr80.dll, msvcm90.dll, msvcrt90.dll und msvcr90.dll zu erwähnen.)

    Und die sollten alle auf jedem PC drauf sein? Nein, es ist besser, das installiert jede Anwendung nach Bedarf.



  • Dann muss er seine .exe halt mit den benötigten dlls ausliefern, damit der client sie auf seinem Rechner bei bedarf installieren kann. Sie fest reinzulinken ist ja gerade nicht der Sinn der dll. Sie nicht mitzuschicken ist hingegen nur halb ausgelieferte Software.



  • audacia schrieb:

    Die meisten Anwender sind recht glücklich, nicht noch irgendwelche Runtime-Libraries herunterladen zu müssen, von Ungetümen wie dem .NET-Framework ganz zu schweigen.

    Es geht nicht um .NET sondern um vielleicht ein 2,7 MB Packet was man bei MS runter laden muß. Ist natürlich selbt mit einem Analogmodem in stolzen 7 Min. runter geladen.

    audacia schrieb:

    Und die sollten alle auf jedem PC drauf sein? Nein, es ist besser, das installiert jede Anwendung nach Bedarf.

    Die benötigten CRTs sollten natürlich vorhanden sein. Warum auch nicht? Und natürlich nur bei Bedarf! Sonst hätte ich nicht geschrieben, das man seinen Kunden den Link geben soll. Wenns fehlt ➡ installieren ➡ für die Zukunft vorhanden.
    Keiner sagt das jeder User 100 CRTs aus dem Netz suchen soll, obwohl er nur eine CRT braucht. Aber hier im Forum kommt jeden Tag einer an und fragt, warum seine EXE nicht auf dem PC des Kumpels läuft. Ja mein Gott, der hat die CRT nicht drauf und muß sie installieren. Wenn er kein DirectX hat, sagt ihr ihm ja auch nicht, er soll DirectX statisch linken. Warum? Weil DirectX auf dem PC vorhanden sein sollte. Wenn nicht, gibt man nen Link zum MS-Download oder liefert DX zum installieren mit. Warum? Damit der essenzielle Mist erstmal vorhanden ist.

    Natürlich kann jeder statisch linken, wenn er will. Aber man sollte die Fragesteller informieren, und nicht blind empfehlungen aussprechen.



  • Ein Nachteil des statischen Links ist das die Anwendung ohne einen Recompile nie von neueren Versionen einer DLL profitieren kann. Bei sicherheitskritischen Anwendungen kann das ein Problem werden.



  • Badestrand schrieb:

    edit: Meine Meinung: Aber bevor man die DLLs mitliefert, kann man auch gleich statisch linken. Der Link macht noch Sinn, allerdings werden die meisten Benutzer nicht wissen, ob sie die CRT schonmal installiert haben. Legt man die DLLs bei, ist das Päckchen doch wieder größer als mit statischem Linken, dann fällt der Vorteil wieder weg. Oder gibt's beim statischen Linken weitere Nachteile außer dass die exe ein Eckchen größer wird?

    Ehm, der User braucht doch nur die CRT installieren, wenn sie ihm fehlt. Spätestens beim starten oder installieren deiner Anwendung, bekommt er eine Fehlermeldung, das die CRT fehlt.

    Jedes Spiel hat in der Anleitung drin stehen "Sie benötigen mind. DX Version Y und falls nicht vorhanden, müssen Sie es installieren." Dann findet man auf der CD-ROM meistens das DX-Installer-Packet. Wer online vertreibt, kann es auf seiner Homepage separat anbieten oder den User auf die MS-Seite verweisen. Da wird nichts größer.

    Die DLLs machen bei solchen Sachen wie Runtimes sehr wohl Sinn. Wie gesagt, eine CRT ist essenziell. Und natürlich hat statisches Linken auch Nachteile zur Laufzeit. Z.B. wenn man Daten zwischen zwei Anwendungen austauscht, und jede Anwendung hat eine eigenen CRT-Instanz, kann der Datenaustausch nicht so gut funktionieren, wie wenn sie die gleiche CRT aus der selben DLL benutzen.

    Auch startet eine EXE schneller, wenn sie kleiner ist und die CRT schon mal reingeladen wurde (ne DLL ist ja nur einmal im RAM). Klar, die CRT ist zum Glück nicht so groß, aber da sie von jedem C und C++ Programm genutzt wird, macht sie als DLL Sinn. Es geht ja nicht um eine Library, die nur von einem speziellen Programm genutzt wird.

    Von den Updates durch Servicepacks ganz zu schweigen. Sagen wir mal eine CRT hat nen Sicherheitsloch oder sonstigen Bug. Wenn man diese CRT-DLL updated, profitieren alle C und C++ Programme davon, die diese CRT-Version benutzen. Alle die statisch linken, leben mit dem Sicherheitsloch oder Bug weiter. Ist doch sogar erst bei der CRT 8.0 passiert. Seit November 2007 gibts nen SP1 dafür, weil sich Bugs eingeschlichen haben.



  • Artchi schrieb:

    Badestrand schrieb:

    edit: Meine Meinung: Aber bevor man die DLLs mitliefert, kann man auch gleich statisch linken. Der Link macht noch Sinn, allerdings werden die meisten Benutzer nicht wissen, ob sie die CRT schonmal installiert haben. Legt man die DLLs bei, ist das Päckchen doch wieder größer als mit statischem Linken, dann fällt der Vorteil wieder weg. Oder gibt's beim statischen Linken weitere Nachteile außer dass die exe ein Eckchen größer wird?

    Ehm, der User braucht doch nur die CRT installieren, wenn sie ihm fehlt. Jedes Spiel hat in der Anleitung drin stehen "Sie benötigen mind. DX Version Y und falls nicht vorhanden, müssen Sie es installieren." Dann findet man auf der CD-ROM meistens das DX-Installer-Packet. Wer online vertreibt, kann es auf seiner Homepage separat anbieten oder den User auf die MS-Seite verweisen. Da wird nichts größer.

    Gut, kommt natürlich drauf an, an wen und wie man die Software verbreitet. Verbreitet man sie über's Internet, kann man immerhin schon einmal davon ausgehen, dass der Benutzer eine Internet-Anbindung hat. Verbreitet man sie per CD, kann man die DLLs dazulegen.
    Ich bezweifle aber, dass ein Nicht-Programmierer weiß, ob er die CRT installiert hat oder nicht, also wird er sie so oder so neu installieren.
    Gut, man könnte überprüfen, ob die entsprechenden DLLs schon vorhanden sind, ein pauschales "Bitte stellen Sie sicher, dass die neueste Version des CRT installiert ist" finde ich Sinn-schwach.
    Ich halte es generell lieber so, dass die Software On-The-Fly funktioniert, gerade manuelles herunterladen o.ä. finde ich ätzend. Und, wie gesagt, ich finde nicht, dass man eine Internet-Anbindung voraussetzen darf.

    Artchi schrieb:

    Die DLLs machen bei solchen Sachen wie Runtimes sehr wohl Sinn. Wie gesagt, eine CRT ist essenziell. Und natürlich hat statisches Linken auch Nachteile zur Laufzeit. Z.B. wenn man Daten zwischen zwei Anwendungen austauscht, und jede Anwendung hat eine eigenen CRT-Instanz, kann der Datenaustausch nicht so gut funktionieren, wie wenn sie die gleiche CRT aus der selben DLL benutzen.

    Auch startet eine EXE schneller, wenn sie kleiner ist und die CRT schon mal reingeladen wurde (ne DLL ist ja nur einmal im RAM). Klar, die CRT ist zum Glück nicht so groß, aber da sie von jedem C und C++ Programm genutzt wird, macht sie als DLL Sinn. Es geht ja nicht um eine Library, die nur von einem speziellen Programm genutzt wird.

    Von den Updates durch Servicepacks ganz zu schweigen. Sagen wir mal eine CRT hat nen Sicherheitsloch oder sonstigen Bug. Wenn man diese CRT-DLL updated, profitieren alle C und C++ Programme davon, die diese CRT-Version benutzen. Alle die statisch linken, leben mit dem Sicherheitsloch oder Bug weiter. Ist doch sogar erst bei der CRT 8.0 passiert. Seit November 2007 gibts nen SP1 dafür, weil sich Bugs eingeschlichen haben.

    Das sind gute Argumente 👍 Auch wenn aus meiner Sicht das Sicherheits-Argument als einziges wirklich sinnvoll ist.



  • Fellhuhn schrieb:

    Ein Nachteil des statischen Links ist das die Anwendung ohne einen Recompile nie von neueren Versionen einer DLL profitieren kann. Bei sicherheitskritischen Anwendungen kann das ein Problem werden.

    ... aber auch zu einer Stärke, weil Dir niemand eine gehackte DLL unterschieben kann. 😃

    DLLs koppeln eben unterschiedliche Anwendungen - mit allen Vor- und Nachteilen.
    Wenn Dein Programm die DLL in der Version 1.0 braucht und ein anderes aber in der (inkompatiblen) Version 2.0, dann muss man schon seeehr fummeln, bis das vernünftig läuft.

    Ich will jetzt kein Plädoyer für/gegen das Eine halten, sondern nur meiner Meinung Ausdruck verleihen: Es kommt halt drauf an ...

    Gruß,

    Simon2.



  • DLLs koppeln eben unterschiedliche Anwendungen - mit allen Vor- und Nachteilen.
    Wenn Dein Programm die DLL in der Version 1.0 braucht und ein anderes aber in der (inkompatiblen) Version 2.0, dann muss man schon seeehr fummeln, bis das vernünftig läuft.

    Hem, weiß jetzt nicht was du damit meinst? Die DLL-Hell gibts seit WinXP nicht mehr, da jede DLL versionierbar ist (echt versionierbar, nicht nur über den Dateinamen!). Natürlich sind alte DLLs davon nicht betroffen, da gibts die DLL weiterhin. 😉 Aber jeder der mit einem aktuellen MS-Compiler arbeitet, kann versionierte DLLs erzeugen und benutzen. Wird auch alles fein und säuberlich in WinXP in einem System-Verzeichnis entsprechend verwaltet und man kann nur mit Admin-Rechten darin die DLLs ablegen.

    Das ist ja auch gerade der Grund, warum viele erst auf diese Probleme stossen, das die EXE auf einmal nicht läuft: genau die von der EXE geforderte DLL in genau der bestimmten Versionsnummer ist nicht vorhanden. Damals war das natürlich anderes. Da liefs wahrscheinlich zufällig. 😉

    Wie es unter Linux und Unix mit dynamischen Libs aussieht weiß ich dagegen leider absolut nichts. Kann nur für Windows sprechen.



  • Artchi schrieb:

    Es geht nicht um .NET

    Deshalb schwieg ich ja auch davon 😉

    Artchi schrieb:

    sondern um vielleicht ein 2,7 MB Packet was man bei MS runter laden muß.

    Es ist ein Umweg und wird unter Umständen als zusätzlicher Ballast auf dem Rechner empfunden. Daß es eigentlich völlig problemlos ist, heißt nicht, daß es auch so empfunden wird.

    audacia schrieb:

    Aber hier im Forum kommt jeden Tag einer an und fragt, warum seine EXE nicht auf dem PC des Kumpels läuft. Ja mein Gott, der hat die CRT nicht drauf und muß sie installieren. Wenn er kein DirectX hat, sagt ihr ihm ja auch nicht, er soll DirectX statisch linken. Warum? Weil DirectX auf dem PC vorhanden sein sollte. Wenn nicht, gibt man nen Link zum MS-Download oder liefert DX zum installieren mit.

    Meinst du nicht, daß du dich da in der Kategorie etwas vertust? DirectX ist mit Sicherheit ein anderes Kaliber als eine RTL, und ein handelsübliches Spiel ist auch nicht mit den Anwendungen, die hier an Freunde weitergegeben werden sollen, zu vergleichen. Es bereitet einfach weniger Umstände, ein solches Programm statisch zu linken.

    Artchi schrieb:

    Und natürlich hat statisches Linken auch Nachteile zur Laufzeit. Z.B. wenn man Daten zwischen zwei Anwendungen austauscht, und jede Anwendung hat eine eigenen CRT-Instanz, kann der Datenaustausch nicht so gut funktionieren, wie wenn sie die gleiche CRT aus der selben DLL benutzen.

    Wie tauschst du Daten zwischen zwei Anwendungen? Mit IPC? Wo sollen da die Vorteile liegen?
    Oder meinst du die Vorteile, die sich ergeben, wenn z.B. Anwendung und DLL denselben Speichermanager benutzen, so daß im einen Modul allozierte Daten auch im anderen freigegeben werden können?

    Zudem hat eine statische CRT sogar geringe Laufzeitvorteile, da in Windows DLL-Funktionen über eine Jumptable angesprochen werden und somit ein CALL mehr nötig ist.

    Dynamisches Linken ist insbesondere vorteilhaft, wenn ein Programm aus mehreren Modulen besteht, die alle dieselben Bibliotheken verwenden, so daß diese nur einmal geladen werden und das Working Set des Programmes kleiner bleibt, und zudem, da ein gemeinsamer Speichermanager benutzt werden kann.

    Artchi schrieb:

    Klar, die CRT ist zum Glück nicht so groß, aber da sie von jedem C und C++ Programm genutzt wird, macht sie als DLL Sinn. Es geht ja nicht um eine Library, die nur von einem speziellen Programm genutzt wird.

    Angesichts der oben dargelegten Vielzahl von CRT-Versionen für verschiedene Sprachen, verschiedene Compiler und verschiedene Compilerversionen schätze ich die Überschneidungsrate als eher gering ein. Nur wenige Programme, die ich parallel verwende, sind mit der gleichen Compilerversion übersetzt. Zudem verwenden die meisten kleineren Programme nicht allzu viele Funktionen aus der RTL, so daß die RTL für den wahrscheinlichen Fall, daß sie von keinem laufenden Programm schon geladen wurde, das Working Set eher unnötig vergrößert.

    Simon2 schrieb:

    ... aber auch zu einer Stärke, weil Dir niemand eine gehackte DLL unterschieben kann. 😃

    Keine Sorge, da gibts schon Mittel und Wege, die DLL trotzdem in das Programm zu bekommen :p



  • Ich will ja niemanden abhalten statisch zu linken. Aber ich fand es einfach nicht richtig, den Fragesteller nicht korrekt zu informieren. Es gibt nicht umsonst die unterschiedlichen Deployment-Verfahren. Und sicherlich gibt es auch nicht ohne Grund das statische Linken der CRT. Keine Frage.



  • jungs ich bin echt beeindruckt von euch das ging ja mal schnell:)
    1a

    ich habe jedenfalls gehört man kann sich ein installer basteln mit der exe und der dll datei die dann richtig abgespeichert werden...aber soll eigentlich nur ein kleines prog sein...



  • audacia schrieb:

    ...

    Simon2 schrieb:

    ... aber auch zu einer Stärke, weil Dir niemand eine gehackte DLL unterschieben kann. 😃

    Keine Sorge, da gibts schon Mittel und Wege, die DLL trotzdem in das Programm zu bekommen :p

    Was aber nur geht, wenn Du das binary hackst .... wenn Du das kannst, brauchst Du aber kein "DLL-Unterschieben" mehr.
    Mit dem "DLL-unterschieben" aber kannst Du ALLE Programme, die diese nutzen, hacken, ohne Dich mühsam durch alle Binaries zu buddeln und zwar über den ganz normalen Installationsweg.

    Viel skeptischer bin ich bei DLL-Benutzung aber nicht bzgl der Sicherheits-, sondern bzgl. der Kompatibilitätsaspekte. Bugfixes über eine neue DLL: Prima !
    Aber bei Versionsänderungen verheddert man sich sehr leicht.

    Gruß,

    Simon2.


Anmelden zum Antworten