Domanda

Ho intenzione di iniziare un nuovo progetto C ++ che si baserà su una serie di librerie, tra cui parte delle librerie Boost, la log4cxx o la biblioteca di registrazione di Google - e come il progetto si evolve altri quelli così (che non ci riesco tuttavia anticipare).

Si dovrà essere eseguito su entrambi i sistemi a 32 e 64 bit, più probabilmente in un abbastanza varia ambiente Linux in cui non mi aspetto di avere tutte le librerie necessarie disponibili né Su privilegi.

La mia domanda è, dovrei costruire la mia istanza dinamicamente o staticamente il collegamento a tutte queste librerie?

Note:

(1) Sono consapevole del collegamento statico potrebbe essere un dolore durante lo sviluppo (compilazione più volte, cross-compilazione sia per il 32 e 64 bit, scendendo catene di dipendenza per includere tutte le biblioteche, ecc), ma è molto più facile durante i test -. basta spostare il file ed eseguire

(2) D'altra parte, le cuciture di collegamento dinamici più facile durante la fase di sviluppo - brevi tempi di compilazione, (non so davvero come gestire il collegamento dinamico a 64 bit librerie dal mio ambiente dev 32 bit), senza fretta con la dipendenza Catene. La distribuzione di nuove versioni d'altra parte può essere brutto -. Specialmente quando sono richieste nuove librerie (vedi condizione di cui sopra di non avere diritti Dom su macchine mirati, né queste librerie disponibili)

(3) Ho letto le relative domande per quanto riguarda questo argomento, ma non riuscivo a capire quale approccio sarebbe meglio si adattano al mio scenario.

Conclusioni:

  1. Grazie a tutti per il vostro contributo!
  2. Io probabilmente andare con collegamento statico perché:
    • deployment più facile
    • Prestazioni prevedibili e risultati più costanti durante perf. test (vedi questo articolo: http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • Come sottolineato, la dimensione e la durata della compilazione di statica vs dinamica non sembra essere una differenza enorme
    • cicli di prova più facile e più veloce
    • posso tenere tutto il dev. ciclo sul mio dev. macchina
È stato utile?

Soluzione

linking statico ha una cattiva reputazione. Abbiamo enormi dischi rigidi in questi giorni, e tubi straordinariamente grassi. Molti dei vecchi argomenti a favore di collegamento dinamico sono modo meno importante oggi.

Inoltre, v'è una buona ragione per preferire il collegamento statico su Linux:. La pletora di configurazioni di piattaforma là fuori rendono quasi impossibile garantire l'eseguibile funzionerà attraverso anche una piccola parte di loro senza il collegamento statico

Ho il sospetto che questo non sarà un parere popolare. Belle. Ma ho 11 anni di esperienza di applicazioni la distribuzione su Linux, e fino a quando qualcosa di simile a LSB davvero decolla e davvero si estende è raggiungere, Linux continuerà ad essere molto più difficili da implementare applicazioni su. Fino ad allora, collegare staticamente l'applicazione, se si deve eseguire in una vasta gamma di piattaforme.

Altri suggerimenti

Io probabilmente utilizzare il collegamento dinamico durante (la maggior parte) lo sviluppo, e poi passare ad linking statico per le fasi finali di sviluppo e (tutti) la distribuzione. Per fortuna, c'è poco necessità di test in più quando si passa dalla dinamica alla statica legame delle librerie.

Questo è un altro voto per il collegamento statico. Non ho notato significativamente più lunghi i tempi di collegamento per le applicazioni. L'applicazione in questione è una console linea di app ~ 50K, con più librerie che è compilato per un mazzo di fuori delle macchine ordinarie, supercomputer per lo più con 100-10.000 core. Con il collegamento statico, si sa esattamente cosa librerie che si sta per essere utilizzando, può facilmente testare le nuove versioni di loro.

In generale, questo è il modo in cui la maggior parte delle applicazioni Mac sono costruiti. E 'ciò che permette l'installazione sia semplicemente copiando una directory sul sistema.

La cosa migliore è lasciare che fino al confezionatore e fornire entrambe le opzioni del configure / make script. Di solito il collegamento dinamico avrebbe la preferenza da allora sarebbe facile per l'aggiornamento delle librerie quando è necessario, vale a dire quando le vulnerabilità di sicurezza, ecc vengono scoperti.

Si noti che se non si dispone dei privilegi di root per installare le librerie nelle directory di sistema è possibile compilare il programma in modo tale che esso deve prima cercare altrove eventuali librerie dinamiche necessarie, questo viene realizzato impostando la direttiva RUNPATH in binari ELF. È possibile specificare una directory con l'opzione -rpath della ld linker.

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