|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
[c++] programmi compilati e dll
Ciao a tutti.
Quando compilo un programma con delphi funziona su ogni pc che ho in casa (xp/vista/win7), con dev-c++ (mingw) o netbeans(cygwin) mi chiede delle dll sugli altri pc... E` una cosa normale e vanno allegate al programma o sbaglio nel compilare ? |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
lulz con delphi compilo la roba scritta con delphi non c++
cmq uno vuole libgcc_s_dw_2-1.dll e l'altro cygwin1.dll ( anche con solo una main con cout << "ciao" ) |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Se non compili il codice staticamente hai bisogno del runtime del compilatore (oltre che di tutte le eventuali librerie utilizzate nel codice) per eseguire il programma.
In caso di compilazione statica invece hai 1 unico eseguibile un pò grossotto. Come se nell'era dei Tera un eseguibile di 5Mb possa essere un problema... |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
E devi ricompilare e ridistribuire tutto ad ogni aggiornamento delle dipendenze, e non condividi il codice in memoria con altre applicazioni, etc.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
ecco mancava -static nel linker
tnx |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Ti faccio un esempio: secondo te sqlite fornito con firefox con quanti altri applicativi sarà condiviso? Nessuno. Nemmeno con thunderbird. Quanti software condividono OpenSSL? Nessuno, ognuno ha la propria versione. Quanti condividono Qt? Nessuno, ognuno ha la propria versione. Alla fin fine non hai centinaia di programmi linkati staticamente, ma centinaia di programmi che caricano dll quasi uguali. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Probabilmente in un contesto come quello Windows dove non ci sono "gestori di pacchetti di sistema" e risoluzione di dipendenze di vario tipo, ogni progetto tende a distribuire il suo eseguibile con tutte le dipendenze del caso. Ma non mi sembra una pratica molto buona quella di compilare staticamente: se una dipendenza (che normalmente forniresti come DLL) subisce un aggiornamento per motivi di sicurezza o risoluzione di bug di altro tipo, tu che fai, ridistribuisci l'intero eseguibile linkato staticamente anche alle altre (n-1) dipendenze? Sempre meglio avere una DLL di sistema, dove aggiorni quella e stai a posto per tutti i programmi presenti nel tuo sistema.
Oltretutto, se tu usi Qt staticamente, se io uso Qt staticamente, se lui usa Qt staticamente, allora abbiamo almeno 3 copie di Qt che letteralmente buttano al cesso spazio su disco non necessario (che poi ok, probabilmente ha un costo bassissimo, ma ha un costo). E via dicendo, insomma... Mi sembra che gli svantaggi di usare le DLL siano minori dei vantaggi. Poi ognuno fa come vuole. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#9 | ||||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Pensa un caso: io sviluppo un software con il CRT di Visual Studio 2008, poi l'utente o un software mi installa il runtime di VS2010, possono nascere delle belle sorprese (vedi safari più avanti). Quote:
Ho VLC, Google Earth e 2 Qt Creator, ognuno ha la sua brava copia delle Qt. Che vantaggio c'è stato con il link dinamico? Quote:
Per farti un esempio: a me che ho tutti i Visual Studio installati dalla 6 alla 2010 con relativi runtime, Safari non funziona (ma non funzionava nemmeno quando non avevo ancora VS2010), manda una sequenza infinita di errori di errata inizializzazione del runtime di visual studio e la finestra rimane bianca. E stiamo parlando di Safari non dell'ultimo software uscito dalle mani dell'ultimo programmatore sulla faccia della terra. Anche VLC quando parte integrato nel browser mi mostra lo stesso errore, anche se poi funziona regolarmente. In ogni caso anche con link dinamico ovviamente nessuna condivisione delle librerie, solo copie "private". Ti ritrovi sempre e comunque con il fatto di dover ritestare il software con la versione aggiornata della dipendenza e comunque a dover fornire un pacchetto di installazione. Non vedo nessuna differenza pratica. |
||||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Secondo me la fai troppo tragica: per fare un esempio, nel mio sistema ho installato almeno un paio di programmi Qt, nel caso specifico PokerTH e MiniTube.
Vediamo che libreria usano: Codice:
[jmc@gorgoroth ~]$ ldd `which minitube` [...] libQtGui.so.4 => /usr/lib/libQtGui.so.4 (0xb6dc1000) libQtCore.so.4 => /usr/lib/libQtCore.so.4 (0xb6a3f000) Codice:
[jmc@gorgoroth ~]$ ldd `which pokerth` [...] libQtGui.so.4 => /usr/lib/libQtGui.so.4 (0xb6a48000) libQtCore.so.4 => /usr/lib/libQtCore.so.4 (0xb67db000) Il problema del "DLL hell" che sta sul tuo PC mi sembra dovuto al fatto che hai installato versioni di Visual Studio antidiluviane parallelamente a quelle "moderne". Io non ho problemi, visto che tutti i software sul mio PC usano Qt4... Se dovessi distribuire oggi un software che usa Qt2 (inspiegabilmente), allora evidentemente lo linkerei staticamente per non inzozzare il sistema o causare conflitti di quel tipo. Come se non bastasse, il fatto di usare librerie linkate dinamicamente viene particolarmente utile quando il sistema operativo usa una forma di segmentazione della memoria che consente il riutilizzo dello stesso segmento di codice in memoria RAM (che quella non va nell'ordine dei terabyte) per tutti i processi che ne faranno uso. Tutti i moderni sistemi operativi lo fanno, come conferma anche questo articolo nel caso di Linux: Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#11 | |||||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Quote:
In ogni caso l'installazione di più visual studio contemporaneamente non comporta nessun problema, tant'è che ho altre decine di software che funzionano senza problemi tra cui anche VLC stesso non utilizzato come addin del browser, e i miei. Se Safari è fatto male non è colpa mia, sta di fatto che quel programma non funziona a causa della mia "particolare" configurazione. Con un link statico non sarebbe successo. Quote:
Quote:
Vanno tanto di moda i linguaggi gestiti che utilizzano una quantità abnorme di memoria e mi vieni a fare le pulci su quel poco di memoria in più che potrebbe utilizzare un normale applicativo con il link statico? Se dovessi avere a che fare con un software decisamente oneroso dal punto di vista delle risorse sicuramente userei il linking dinamico, ma con un applicativo normale che di suo più di 20 o 30 mega non occupa non sto nemmeno a pormi il problema e cerco la tranquillità. |
|||||
|
|
|
|
|
#12 | ||||||||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
Quote:
Comunque, Qt 4.6.3: Codice:
[jmc@gorgoroth ~]$ ls -lh /usr/lib/libQtCore.so* lrwxrwxrwx 1 root root 18 8 giu 13.56 /usr/lib/libQtCore.so.4 -> libQtCore.so.4.6.3 lrwxrwxrwx 1 root root 18 8 giu 13.56 /usr/lib/libQtCore.so.4.6 -> libQtCore.so.4.6.3 -rwxr-xr-x 1 root root 2,5M 8 giu 13.57 /usr/lib/libQtCore.so.4.6.3 Quote:
Quote:
Quote:
Quote:
Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||||||||
|
|
|
|
|
#13 | |||||||
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
Non sarà un sistema raffinato come quello di Linux, ma va egregiamente: basta non avere copie delle DLLs nelle directory da cui faccio partire i programmi per poter usare la copia comune. Alla faccia della pulizia Quote:
Nulla vieta, però, in caso contrario, di installare due major (es. Qt 3 e Qt 4) per garantire la retrocompatibilità: sarebbero sempre solo 2 librerie invece di n. Il caso estremo di librerie il cui comportamento (o l'interfaccia) cambiano vistosamente tra sottoversioni penso sia abbastanza trascurabile: se un progetto si basa su una libreria simile, evidentemente si basa su una framework mal sviluppato. Comunque non mi vengono in mente esempi di questo caso. Quote:
Quote:
Quote:
Quote:
Viceversa a volte valuto l'idea in Windows: se voglio ridistribuire un piccolo programma, posso distribuire un semplice eseguibile e non una cartella "inscindibile" (nel caso che l'utente non abbia le dipendenze installate). Quote:
La trovo una soluzione naturale in Linux, artefatta in Windows (per via della necessità di "spulciare" librerie ridondanti nelle cartelle dei software) ma nel complesso solitamente conveniente.
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|||||||
|
|
|
|
|
#14 | |||||||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
http://labs.trolltech.com/blogs/2009...t-previous-46/ https://bugzilla.redhat.com/show_bug.cgi?id=487075 Quote:
Quote:
Quote:
Quote:
Quote:
Lo stesso vale per 2 versioni o istanze di Visual Studio. Evidentemente le parti a comune sono veramente minimali. Quote:
|
|||||||
|
|
|
|
|
#15 | |||||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Il secondo link fa solo da prova che ridistribuire unicamente libreria corregge il bug completamente, su tutto il sistema: se tu avessi linkato staticamente la libreria rotta? Quote:
Quote:
Quote:
Quote:
Confronta due istanze di programmi che usano linking dinamico e due programmi che usano linking statico. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:52.




















