Domanda

Sto creando un programma c ++, ma voglio essere in grado di offrire all'utente solo un file .exe. Tuttavia, sto usando librerie (curl tra gli altri) che hanno alcune DLL. È possibile compilare queste DLL nel file .exe?

Uso Code :: Blocks e mingw.

È stato utile?

Soluzione

Per raggiungere questo obiettivo è necessario collegamento statico . Ciò richiede che tutte le librerie (e le librerie da cui dipendono ricorsivamente) debbano essere disponibili come librerie statiche. Tieni presente che la dimensione del tuo eseguibile sarà grande, in quanto trasporterà tutto il codice da quelle librerie statiche. Questo è il motivo per cui le librerie condivise (DLL) sono state inventate in primo luogo, per poter condividere codice comune tra le applicazioni. Tuttavia, ciò non sempre funziona così bene su Windows .

Penso che ciò che potresti desiderare sia un programma di installazione che installa il tuo eseguibile e tutto dipende librerie.

Altri suggerimenti

C'è un articolo in DDJ del 2002 che potrebbe avere quello che vuoi:

Fondamentalmente utilizza una combinazione di collegamento alla DLL utilizzando la funzionalità di "caricamento ritardato" di MSVC e comprimendo la DLL come risorsa incorporata in EXE. La DLL viene quindi estratta automaticamente in fase di esecuzione quando viene effettuata la prima chiamata a una delle esportazioni.

Non ho usato questa tecnica, quindi non posso davvero commentare quanto funziona bene, ma sembra sicuramente un'idea brillante.

Puoi utilizzare ILMerge

Mi sono imbattuto una volta nell'utilità dll2lib . Pezzo interessante, anche se costoso. Ti permette di convertire virtualmente qualsiasi dll in una libreria statica, che potrebbe essere successivamente collegata alla tua applicazione per produrre exe solido. IIRC, la versione gratuita mostrerà una certa notifica (MessageBox) quando si accede a una funzione da tale libreria generata.

Hai bisogno di alcuni speciali strumenti packer come XBundler .

Se hai davvero bisogno di farlo, puoi usare questa fantastica libreria che ti permetterà di caricare una DLL dalla memoria. L'ho usato per leggere una DLL da una risorsa e caricarla per me.

https://github.com/fancycode/MemoryModule

In generale, no. Le DLL hanno un comportamento speciale non banale, come l'acquisizione di Loader Lock quando vengono caricate e la chiamata a DllMain in quei punti. Mentre un linker teorico potrebbe organizzare la chiamata di ogni DllMain dall'applicazione main (), ciò non avverrebbe in Loaded Lock. Questo blocco caricatore è sotto il controllo del sistema operativo. Inoltre, le DLL ricevono notifica di nuovi thread tramite DLLMain e anche questo sarebbe quasi impossibile da falsificare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top