Frage

Ich erstelle ein C ++ - Programm, möchte dem Benutzer jedoch nur eine .exe -Datei anbieten können. Ich verwende jedoch Bibliotheken (unter anderem Curl), die einige DLLs haben. Ist es möglich, diese DLLs in die .exe -Datei zusammenzustellen?

Ich verwende Code :: Blöcke und Mingw.

War es hilfreich?

Lösung

Um zu erreichen, dass Sie benötigen, benötigen Sie Statische Verknüpfung. Dies erfordert, dass alle Ihre Bibliotheken (und die Bibliotheken, von denen sie rekursiv abhängen) als statische Bibliotheken verfügbar sein müssen. Beachten Sie, dass die Größe Ihrer ausführbaren Datei groß ist, da er den gesamten Code von diesen statischen Bibliotheken trägt. Aus diesem Grund wurden in erster Linie gemeinsame Bibliotheken (DLLs) erfunden, um gemeinsame Code zwischen Anwendungen zu teilen. Das funktioniert jedoch nicht immer So gut unter Windows.

Ich denke, was Sie vielleicht wirklich wollen, ist ein Installateur Das installiert Ihre ausführbare Datei und alles seine abhängigen Bibliotheken.

Andere Tipps

Es gibt einen Artikel in DDJ aus dem Jahr 2002, der möglicherweise das hat, was Sie wollen:

Grundsätzlich verwendet es eine Kombination aus Verknüpfung mit der DLL unter Verwendung von MSVCs "Delayed Load" -Funktion und Verpackung der DLL als eingebettete Ressource im EXE. Die DLL wird dann zur Laufzeit automatisch extrahiert, wenn der erste Anruf eines der Exporte getätigt wird.

Ich habe diese Technik nicht verwendet, also kann ich nicht wirklich kommentieren, wie gut sie funktioniert, aber es scheint eine glatte Idee zu sein.

Sie können verwenden Ilmerge

Ich stieß auf dll2lib Nützlichkeit einmal. Interessantes Stück, obwohl teuer. Sie können praktisch alle DLLs in eine statische Bibliothek konvertieren, die später mit Ihrer Anwendung zur Herstellung solider Exe verknüpft werden kann. IIRC, kostenlose Version zeigt eine bestimmte Benachrichtigung (MessageBox), wenn sie eine Funktion aus einer solchen generierten Bibliothek eingeben.

Sie benötigen einige spezielle Packer -Tools wie Xbundler.

Wenn Sie dies wirklich erreichen müssen, können Sie diese fantastische Bibliothek verwenden, mit der Sie eine DLL aus dem Speicher laden können. Ich habe es verwendet, um eine DLL aus einer Ressource zu lesen und sie für mich zu laden.

https://github.com/fancycode/MemoryModule

Im Allgemeinen nein. DLLs haben ein spezielles Verhalten, das nicht trivial ist, z. B. das Erwerb von Lader-Sperre, wenn sie geladen sind, und das Aufrufen von DLLMain an diesen Punkten. Während ein theoretischer Linker dafür sorgen konnte, dass jeder DLLMain von der Anwendung Main () aufgerufen wird, würde er unter geladenem Schloss nicht auftreten. Diese Ladersperre unter Kontrolle des Betriebssystems. Außerdem werden DLLs über ihre DLLMain über neue Threads informiert, und es wäre auch fast unmöglich, dies zu fälschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top