Statisches Linken der CRT



  • Wieso kann man nicht einfach eine Standalone bereitstellen, ohne dass der Endbenutzer irgendwelches Restzeug installieren muss? Ihr drückt es alle so aus, als wäre statisches Linken nur dann erlaubt, wenn man nen Pakt mit dem Teufel eingeht. Wieso sollte ich Beispielsweise für ein Hilfsprogramm dass 30 KB groß is ne 2MB DLL mitliefern?



  • brt000 schrieb:

    Wieso kann man nicht einfach eine Standalone bereitstellen, ohne dass der Endbenutzer irgendwelches Restzeug installieren muss?

    Darfst du ja. Mach es einfach.



  • brt000 schrieb:

    Wieso sollte ich Beispielsweise für ein Hilfsprogramm dass 30 KB groß is ne 2MB DLL mitliefern?

    Gegenfrage: Wieso sollte jedes Programm das mit VC2010 gebuildet wurde die selben Codeteile immer wieder in meinen RAM laden wenn alle einfach eine globale dll verwenden könnten. Abgesehen davon hast du mit der dll den Vorteil dass Bugfixes, Security Updates etc. greifen. Es hat seine Gründe warum die Runtime per default dynamisch gelinked wird, genaueres dazu findest du in der MSDN. Das wesentliche Zitat:

    MSDN schrieb:

    It is not recommended to redistribute C/C++ applications that statically link to Visual C++ libraries.



  • Das mit der Sicherheit ist ein anderes Thema, dass stimmt. Aber in der heutigen Zeit von zuwenig Ram sprechen. Weis nicht ... Es geht ja nicht um 100te von MB.



  • imo gehts hier ums Prinzip, auch wenns nur 1MB groß is. Eine ordentliche Software macht sowas einfach nicht bzw. macht sowas nur wenn es ein schlagkräftiges Argument dafür gibt aber ein solches wurde hier noch nicht genannt...



  • Ok, wollte noch dazu sagen das es von Software zu Software verschieden ist. Wenn am Zielsystem keine Redist installiert werden kann, dann hat man keine Wahl.
    Aber das läuft auf dein Post hinaus...



  • @dot:
    Öhm.
    Dass es z.B. nervt wenn man Programme installieren muss, oder erstmal ne Runtime installieren muss damit sie laufen?



  • lowbyte_ schrieb:

    Ok, wollte noch dazu sagen das es von Software zu Software verschieden ist. Wenn am Zielsystem keine Redist installiert werden kann, dann hat man keine Wahl.

    Natürlich, das wäre dann ein Argument über das man reden kann.

    hustbaer schrieb:

    Öhm.
    Dass es z.B. nervt wenn man Programme installieren muss, oder erstmal ne Runtime installieren muss damit sie laufen?

    Anständiges Setup machen? Abgesehen davon ist die Wahrscheinlichkeit dass die Runtime bereits vorhanden ist relativ hoch (je weniger so denken desto besser)...



  • hustbaer schrieb:

    @dot:
    Öhm.
    Dass es z.B. nervt wenn man Programme installieren muss, oder erstmal ne Runtime installieren muss damit sie laufen?

    👍



  • Und warum linkst Du nicht statisch??? Was hindert dich daran????
    http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/





  • Jochen Kalmbach schrieb:

    Und warum linkst Du nicht statisch??? Was hindert dich daran????
    http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/

    Dass es wie gesagt nicht funktioniert. Ich mache rebuild all und die exe ist immer noch 28 KB groß.



  • Dann machst du was falsch! Habe den link ja schon gepostet. So kannst du nichts mehr falsch machen 🙄 😉

    http://www.kalmbach-software.de/screencasts/VC2008EE-StaticLinkCRT/

    Du musst halt überprüfen ob ob es funktioniert! (Output window)
    Ansonnsten lösche mal den DEBUG & RELEASE Folder. Und probier nochmal zu komp. & link.



  • Ja anscheinend liegts am Debug-Link:

    Game.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall CWorldTransform::TranslateAbs(float,float,float)" (?TranslateAbs@CWorldTransform@@QAEXMMM@Z)" in Funktion ""public: void __thiscall CGame::OnRender(void)" (?OnRender@CGame@@QAEXXZ)"[...]
    

    Weiß jemand, wie ich die Fehlermeldungen wegkriege? Das sind die, die ich ganz besonders nicht leiden kann...

    Ich habe 3 Projekte (2 Libs, dann die Exe). Die Libs sind alle je nach Build richtig eingestellt (postfix "_d".lib) beim Debug Mode. Nur im Debugbuild kommen diese Linker Errors. Die Headerdatei wird nur ein Mal eingebunden, die Funktionen sind in der .cpp Datei definiert. Woran kann es noch liegen?



  • Du musst auch *alle LIBs* dann statisch linken!



  • So habe jetzt alle Fehler behoben, Compiler linkt fehlerfrei alle 6 Builds mit Rebuild ALL, habe DEBUG & RELEASE Ordner gelöscht. Und ja, der Schalter steht auf Multithreaded(-Debug). Die .exe ist trotzdem 26 KB groß. Sollte ich einfach das gesamte Projekt nochmal neu erstellen? Das wird jedoch wieder ein Haufen aufwand werden wieder alle Variablen und Ordner zu setzen.



  • Sei doch froh 😉

    Schau doch mal mit www.dependencywalker.com nach, welche Abhängigkeiten Du hast...



  • dot schrieb:

    hustbaer schrieb:

    Öhm.
    Dass es z.B. nervt wenn man Programme installieren muss, oder erstmal ne Runtime installieren muss damit sie laufen?

    Anständiges Setup machen? Abgesehen davon ist die Wahrscheinlichkeit dass die Runtime bereits vorhanden ist relativ hoch (je weniger so denken desto besser)...

    Du hast mich vielleicht falsch verstanden: ich will gar kein Setup haben (müssen). Für doof-User die sich ohne Setup nicht auskennen gerne eins mitliefern. Ich mag aber Programme die es auch als .zip zum runterladen gibt, die ich dann einfach wohin kopiere und sie laufen.

    BTW: die Chance dass irgendwo die MSVC 2010 Runtime bereits installiert ist ist nicht unbedingt SO gross. Ich glaube da sind ist die Chance höher dass man 10+ side-by-side Kopien der VS 2005 Runtime findet, als dass 1x die VS 2010 "installiert" (im System registriert) ist.

    ps: ich finde MS sollte die Visual Studio Runtimes einfach mit Windows Update mitliefern und updaten (als "wichtiges" Update, also opt-out für 99% der Windows-User). Tun sie leider nicht, warum weiss ich nicht. Vielleicht rechtliche Probleme, k.a.


Anmelden zum Antworten