2009-05-01 12 views
7

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

Uso Codice :: Blocchi e mingw.

+1

Si prega di notare che potrebbero esserci anche problemi di licenza coinvolti. Per esempio. alcune licenze consentono il collegamento statico solo se si fornisce il codice sorgente completo del programma. –

risposta

9

Per ottenere questo è necessario static linking. Ciò richiede che tutte le librerie (e le librerie da cui dipendono in modo ricorsivo) debbano essere disponibili come librerie statiche. Tieni presente che la dimensione del tuo eseguibile sarà grande, poiché porterà tutto il codice da quelle librerie statiche. Questo è il motivo per cui le librerie condivise (DLL) sono state inventate in primo luogo, per essere in grado di condividere codice comune tra le applicazioni. Tuttavia, ciò non sempre funziona so well on windows.

Penso che quello che potresti veramente desiderare sia un installer che installa il tuo eseguibile e tutte le sue librerie dipendenti.

+1

Preferisco i portatili la maggior parte del tempo, specialmente per gli strumenti. Il programma di installazione riempie il menu Start, il desktop e l'elenco dei programmi in Aggiungi programmi di rimozione.Ecco perché rabbrividisco ogni volta che la gente suggerisce agli installatori questo tipo di domande. YMMV. Ancora, upvoted per il primo paragrafo. – syaz

3

È possibile utilizzare ILMerge

+0

Penso che ILMerge funzioni solo con codice gestito, non con codice nativo. – Ferruccio

+0

Questo è vero. Supponevo che stessero provando a creare una DLL che stavano lavorando in .NET – Ichorus

+0

È anche vero che (un dialetto Microsoft di) C++ può essere compilato in IL. –

2

avete bisogno di alcuni utensili speciali packer come XBundler.

0

In generale, n. Le DLL hanno un comportamento speciale non banale, come l'acquisizione di Loader Lock quando vengono caricate e la chiamata di DllMain in quei punti. Mentre un linker teorico potrebbe organizzare che ciascun DllMain venga chiamato dall'applicazione main(), non si verificherebbe in Loaded Lock. Questo Loader Lock è sotto il controllo del sistema operativo. Inoltre, alle DLL vengono notificati nuovi thread tramite DLLMain, e anche questo sarebbe quasi impossibile da falsificare.

3

Ho trovato l'utilità dll2lib una volta. Pezzo interessante, anche se costoso. Permette di convertire virtualmente qualsiasi DLL in una libreria statica, che può essere successivamente collegata con l'applicazione per produrre exe solido. IIRC, la versione gratuita mostrerà alcune notifiche (MessageBox) quando si entra in una funzione da tale libreria generata.

4

C'è un articolo in DDJ a partire dal 2002 che possono avere ciò che si vuole:

Fondamentalmente si utilizza una combinazione di collegamento alla DLL utilizzando la funzionalità e l'imballaggio di MSVC 'di carico in ritardo' la DLL come risorsa incorporata nell'EXE. La DLL viene quindi automaticamente estratta in fase di esecuzione quando viene effettuata la prima chiamata a una delle esportazioni.

Non ho usato questa tecnica, quindi non posso davvero commentare come funziona bene, ma sicuramente sembra una buona idea.

2

Se è davvero necessario eseguire questa operazione, è possibile utilizzare questa fantastica libreria che consente 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