Newsgroup: it.comp.lang.c++
Titolo: Perche' non e' possibile linkare staticamente la stdc++ ?

CI avevo provato in passato, mi sembra sotto Solaris, ma non ci ero
riuscito.
Adesso prima di riprovarci, vorrei sapere se almeno e' fattibile.
Penso ci sia qualcosa legato ai template, che non permette la cosa...
Vorrei una vostra opinione.
L.

 Penso ci sia qualcosa legato ai template, che non permette la cosa...
Non mi viene in mente nessuna ragione per cui non dovrebbe essere
possibile linkare staticamente la libreria standard.
Se hai problemi a creare un eseguibile standalone, considera che su
linux esistono dei programmi (e.g. 
http://statifier.sourceforge.net/
 )
che trasformano un eseguibile che necessita di librerie dinamiche in
un unico eseguibile linkato pseudo-staticamente.
Saluti,
The Librarian

On Feb 18, 4:59 pm, 
neuromancer...@gmail.com
 wrote:

Mi pare ovvio che non esiste una risposta assoluta. Dipende da quello
che permette di fare il tuo compilatore.
Ciao,
Nicola

 
Nello specifico era il gcc 3.4. Sotto Solaris 9.


-- 
cc = callcc {|cc| cc.call cc}; cc.call cc

 The Librarian

 altri linguaggi e non solo il C/C++ ...
Si, dovrebbe funzionare con qualsiasi linguaggio compilato, anche se
io l'ho provato solo una volta per fare una prova semplice semplice in
C.
Comunque considera che il file prodotto e' *molto* grande, piu' grande
che se i file fossero stati linkati staticamente in partenza. Inoltre
non credo possa funzionare con programmi che usano plugin caricati a
runtime.
Visto che ti interessa ti segnalo anche Ermine ( 
http://www.magicermine.com/
) che e' simile a statifier ma include  nell'eseguibile anche i file
di dati, creando un eseguibile contentente davvero tutto quello che
serve.
Saluti,
The Librarian
P.S.: Temo di essere ormai terribilmente OT (chiedo venia)

 
Tuttosommato un tool che analizza un modulo, costruisce tutto l'albero 
delle dipendenze (a load time), magari ne fa un bello zip e lo chiude in 
un exe "autonomo" se già non esiste dovrebbe essere non impossibile da 
realizzare...
Ciao
GM

 serve.
Ah, grazie mille ! Si, mi pare interessante, lo leggerò. Per ora 
mi pare di intuire che faccia una sorta di embedding, un po' 
come si fa da secoli con alcune risorse standard (tipo bitmap, 
cursori, stringhe), nei files di risorse.
Figata cmq
ciao
Soviet


 GM

 qualche info sui dettagli di questi aspetti del linking ?
La bibbia su questi argomenti e' certamente "Linkers and Loaders" di
John Levine, pubblicato da Morgan-Kaufman.
Ciao,
Nicola

 Soviet Mario
Attenzione: non ho detto che è facile: ho detto che non è impossibile.
Il formato PE è ben documentato e MS ti da delle API (ad es. debug help 
library) per razzolarci. Credo che li dentro si trovino tutti gli 
strumenti necessari (o almeno buona parte)
http://msdn2.microsoft.com/en-us/library/ms679309(VS.85).aspx
Poi la prima idea che mi viene in mente è quella di zippare tutto in un 
file exe che quando viene lanciato si scompatta in una dir temporanea 
(l'exe e tutto il "carrozzone" di dll che si porta dietro) e poi lancia 
l'exe che a questo punto si trova le dll da cui dipende direttamente 
disponibili. (nota che in ogni caso l'ordine di ricerca delle dll 
prevede al primo posto la dir da cui è lanciato il modulo dipendente)
E' un sistema un po brutale ma potrebbe funzionare...
GM

 
ti aggiungo questi link:
http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx
http://msdn.microsoft.com/msdnmag/issues/02/03/PE2/default.aspx
c'è pure un tool con i sorgenti da studiare

 GM


Si che si puo' fare, fatto x tutti i progetti scritti x fastweb xche' 
non ci fanno installare nessuna libreria sui server di produzione 
(piattaforma Solaris tra l'altro, ma il gcc e` il 3.3). Ecco la 
variabile LIBS da appendere alla tua linea di link, IN FONDO POSSIBILMENTE:
LIBS = -static-libgcc \
        -mt -lposix4 -lthread -lsocket -lnsl \
        -Wl,"-Bstatic" \
        -lstdc++ -Wl,"-Bdynamic" -lm -lm -Wl,"-Bstatic" \
        -lgcc -Wl,"-Bdynamic" -lc -lc -Wl,"-Bstatic" -lgcc
PS posix4, thread, socket e nsl potrebbero non servirti nel tuo 
progetto, se vuoi utilizzare anche i pthread e i socket pero' ti servono :)