Vermeidung der C++ Runtime
-
Weil ich demnächst Zielrechner habe, auf denen nichts installiert werden kann. Kennst ja fertzig aufgesetzte Zielrechner die dann in Massen rausgehen (Hat ja auch seine Berechtigung).
Aber zum Verständnis, ich aheb mir das bisher immer so vorgestellt, das die Dlls praktisch mit in die Exe aber als kompletter Code gepackt werden. Und da die 32/64Bit Versioenn offensichtlich unterschiedlich sind, bezoge ich meine Frage darauf, ob ich beim statisch linken unter eienm 64Bit System besondere Dinge beachten muss.
Gruß,
Mark
-
Ich entschuldige mich für die Massen Rechtsschreibfehler. I-wie spinnt die mobile Auto Korrektur :-/.
-
MarkAPI schrieb:
Ich habe dazu noch eine Frage, wenn ich unter einem 64Bit System linke und als Zielsystem 32Bit ausgewählt habe, werden dann die DLL's als 64BIT Version gelinkt ...
Mit Sicherheit nicht, da als Ziel kein 64bit gewählt wurde.
-
1. Kann man auch solche "Zielrechner" mit allem ausstatten was notwendig ist.
2. Entweder hast Du 64bit oder 32bit. Mischungen gibt es nicht.
3. Keine Miscrosoft Anwendung verpackt DLLs in der EXE wie ein Trojaner. Das macht auch bei dem DLL-Gedanken keinerlei Sinn.
Sinn ist es ja gerade die DLLs von mehreren Anwednungen verwenden zu lassen, und das wäre ja bei dem Verpacken der DLL nicht möglich. ZUdem wäre es unsnnig. Warum noch eine Schichtung im Programm aufbauen, wenn der Code vom Linker direkt eingepackt werden kann.
-
Mit Sicherheit nicht, da als Ziel kein 64bit gewählt wurde.
Gut. Dann wäre das ja schon mal geklärt.
Zu 1: Leider liegt die Entscheidung nicht immer beim Programmierer, ich habe nun lieder ncht immer die Wahl ein Redistributable Package zu installieren. Meine erste Frage zielte ja auch daraufhin ab, ob es auch andere Möglichkeiten gibt.
Zu 2: Naja ich habe momentan den Fall, dass ich als Zielsystem einen 32Bit Rechner eingestellt habe, der Depency Walker sagt mir aber, dass er wohl 64Bit DLLs erwartet.
Zu 3: Ich weiß, dass es Sinn macht normal DLLs zu verwenden, deswegen ja auch meine Frage, ob es einen Weg ohne Runtime aber mit dynamisch linken gibt :).Gruß, Mark
-
MarkAPI schrieb:
Zu 2: Naja ich habe momentan den Fall, dass ich als Zielsystem einen 32Bit Rechner eingestellt habe, der Depency Walker sagt mir aber, dass er wohl 64Bit DLLs erwartet.
Das liegt daran dass du dich wohl auf einem 64bit System befindest und der Dependency Walker bei Abhängigkeiten wie z.B. kernel32.dll die 64bit Variante findet da er wohl im falschen Verzeichnis sucht. Ein 32bit Prozess kann nur 32bit Module laden.
MarkAPI schrieb:
Zu 3: Ich weiß, dass es Sinn macht normal DLLs zu verwenden, deswegen ja auch meine Frage, ob es einen Weg ohne Runtime aber mit dynamisch linken gibt :).
Was bitte soll "ohne Runtime aber mit dynamisch linken" bedeuten? Du kannst auf die Runtime komplett verzichten, dann musst du aber natürlich alles was die Runtime dir zur Verfügung stellt selbst implementieren...
-
Das liegt daran dass du dich wohl auf einem 64bit System befindest und der Dependency Walker bei Abhängigkeiten wie z.B. kernel32.dll die 64bit Variante findet da er wohl im falschen Verzeichnis sucht. Ein 32bit Prozess kann nur 32bit Module laden.
Ok, gut.
Du kannst auf die Runtime komplett verzichten, dann musst du aber natürlich alles was die Runtime dir zur Verfügung stellt selbst implementieren...
Ja ich will ja auf die Runtime komplett verzichten, deshalb habe ich ja auch den Thread gestartet. Die erste Antwort enthielt ja nur die Anleitung zum statisch linken. Da hier aber auch stark die Nachteile betont wurden, möchte ich nur wissen , ob es noch andere Wege gibt und wenn ja wie. Mehr will ich doch gar nicht. Wir drehen uns hier scheinbar etwas im Kreis
oder ich habe einfach nur ein ziemlich großes Verständnis-Problem mit der Runtime.
Also 2 hoffentlich präzise Fragen:
1. Kann ich die Installation der Runtime vermeiden, außer durch statisch linken und wenn ja Wie?
2. Was stellt die Runtime mir zur Verfügung, was ich denn selber implementieren müsste?Bei mir steht halt einfach ein großes Fragezeichen bei dem Thema Runtime, aber ich versuche mich da mal etwas schlauer zu machen.
Gruß, Mark
-
Nein, die Runtime stellt sich das deine Anwendung überhaupt auf dem Rechner läuft... ohne die läuft nix.
-
MarkAPI schrieb:
2. Was stellt die Runtime mir zur Verfügung, was ich denn selber implementieren müsste?
Ich wollte damit eigentlich nur sagen dass es technisch natürlich machbar ist, ich bin mir nur sicher dass du das nicht ernsthaft willst. Aber gut, um deine Frage zu beantworten: Das hängt davon ab was davon du verwendest. Aber du kannst dich drauf einstellen dass du mal von grundlegenden Stringoperationen über new und delete bis hin zu I/O (Dateizugriff, Konsole etc.) alles selber machen darfst. Auf die Standardlibrary wirst du jedenfalls sicherlich praktisch verzichten müssen sofern du nicht großflächig die jeweilig von der Implementierung benötigten Dinge selbst zur Verfügung zu stellst, welche das sind kannst du dann eh aus tausenden Linkerfehlern entnehmen. Der ganze Support für Sprachfeatures wie z.B. Exception Handling oder RTTI wird dann wohl ebenfalls fehlen, falls du das brauchst -> nochwas was du selber machen darfst...
Du kannst dir ja mal per dumpbin ausgeben lassen was in den Standardlibs so alles drin is. Das dürfte dir ein ungefähres Bild vermitteln was du alles selber machen musst. Ich denke du wirst dann doch recht schnell lieber einfach statisch linken. Wenn du nicht gerade einen OS Kernel codest wo die Runtime keine Option weil schlicht und einfach noch nicht vorhanden ist dann ist das jedenfalls wohl keine wirklich brauchbare Option
-
Ja um Gotteswillen, dann werde ich natürlich statisch linken. Ich dachte nur immer bis her, wenn ich andere IDE's verwende bräcuhte ich diese Runtime nicht. Ich dachte bisher das nur Visual Studio diese vorraussetzt und nicht entsprechende Standartlibs. Danke nochmal für die Hilfe.
-
MarkAPI schrieb:
Ich dachte nur immer bis her, wenn ich andere IDE's verwende bräcuhte ich diese Runtime nicht
Wenn du einen anderen Compiler verwendest braucht du die ja natürlich auch nicht...dann brauchst du die entsprechenden Libraries des jeweiligen anderen Compilers
-
Soweit klar.
Ich habe zu dem Thema passend den folgenden Artikel gefunden, indem beschrieben wird welche Wege es gibt, um das Programm lauffähig zu bekommen:
http://msdn.microsoft.com/de-de/library/ms235316.aspx
Dort werden auch die 3 Wege beschrieben, wie ich ohne statisches Linken die "Bereitstellung" ermögliche:
1. Installation des Visual C++ Redistributable Package
2. Verwenden von Visual C++ Redistributable-Mergemodulen
3.Installieren Sie eine bestimmte Visual C++-DLL im Anwendungsordner, indem Sie Dateien aus dem Verzeichnis "Programme\Microsoft Visual Studio 10.0\VC\Redist" verwenden. Diese Methode wird empfohlen, um Benutzern ohne Administratorrechte die Installation von Anwendungen zu ermöglichen oder um eine Anwendung über eine Freigabe auszuführen.
Da ich nun 2 DLLs der CRT benutzte, sollte es rein theoretisch also doch ausreichen die lokal mit zu Installieren (=kopieren?) ? Denn die oben aufgeführten Punkte scheinen ja jeweils Alternativen zu sein.
Ich entschuldige mich dafür, dass ich euch eventuell mit meinen Fragen etwas nerve ;). Ich mache da nur ungern halbgare Sachen.
-
Naja dort in der MSDN steht eh alles. Erstens mal die Gründe warum statisches Linken generell nicht unbedingt eine gute Lösung ist und zweitens die bevorzugte Lösung für dein Problem: Die zwei dlls in den Ordner zur exe packen. Daran dass das natürlich auch gehen würde hab ich, um ehrlich zu sein, im Laufe der Diskussion hier irgendwie gar nicht gedacht, aber es ist in deinem Fall wohl die Lösung mit den wenigsten Nachteilen...