2012-12-02 9 views
10

Probabilmente una risposta semplice; Sono abbastanza confuso con il linguaggio usato nella documentazione GCC per alcune di queste bandiere!Quando utilizzare determinate ottimizzazioni come -fwhole-program e -fprofile-generate con diverse librerie condivise

In ogni caso, ho tre librerie e un programma che utilizza tutti questi tre. Compilare ciascuna delle mie librerie separatamente con singoli (potenzialmente) diversi gruppi di flag di avviso. Tuttavia, compongo tutte e tre le librerie con lo stesso set di flag di ottimizzazione.

Compilare quindi il mio programma principale che collega in queste tre librerie con il proprio set di flag di avviso e gli stessi flag di ottimizzazione utilizzati durante la compilazione delle librerie.

1) Devo compilare le librerie con i flag di ottimizzazione presenti o posso semplicemente usare questi flag quando compilo il programma finale e il collegamento alle librerie? Se quest'ultimo, ottimizzerà tutto o solo alcuni (presumibilmente ciò che viene chiamato) del codice in queste librerie?

2) Vorrei utilizzare -fwhole-program -flto -fuse-linker-plugin e il plug-in del linker gold. In quale fase compilo con questi su ... solo la compilazione finale o questi flag devono essere presenti durante la compilazione delle librerie?

3) Praticamente uguale a 2) tuttavia con -fprofile-generate -fprofile-arcs e -fprofile-use. Capisco che prima si esegue un programma con generare, e quindi con l'uso. Tuttavia, devo compilare ciascuna delle librerie con generare/utilizzare ecc. O solo il programma finale? E se è solo l'ultimo programma, quando poi compilo con -fprofile-use ottimizzerà anche la funzionalità delle librerie?

risposta

1

ho quindi compilare il mio programma principale che collega in questi tre biblioteche con una propria serie di segnali di avvertimento e le stesse flag di ottimizzazione utilizzate durante la compilazione delle librerie.

Ci sono due passaggi qui, non uno. Compilare il programma principale per produrre un file oggetto è il primo e quindi collegare tutto per produrre un eseguibile binario è il secondo passo.

1) Devo compilare le librerie con il flag di ottimizzazione presenti o posso semplicemente usare questi flag quando si compila il programma definitivo e collega alle librerie? Se quest'ultimo, ottimizzerà tutto o solo (presumibilmente ciò che viene chiamato) del codice in queste librerie ?

I flag di ottimizzazione e tutti gli altri flag a livello di compilatore devono essere specificati per file di codice sorgente. Ogni volta che un file sorgente viene compilato per produrre un file oggetto, è necessario specificare i flag. Quindi la produzione di una libreria o di un eseguibile viene eseguita dal linker utilizzando un diverso set di flag per il linker.

2) Vorrei utilizzare -fwhole programma -flto -fuse-linker-plugin e il linker plug-oro. A che punto devo compilare con questi su ... solo la compilazione finale o fare questi flag devono essere presenti durante la compilazione delle librerie ?

È necessario specificare -flto durante la compilazione di ciascun file di codice sorgente (o quelli disponibili).Non è necessario specificare -fuse-linker-plugin e -fwhole-program quando si utilizza il linker oro o GNU ld 2.21 o successivo. Per ulteriori informazioni, vedere documentation su -flto.

3) Praticamente la stessa come 2) ma con, -fprofile-generare -fprofile-archi e -fprofile uso. Capisco che prima si esegue un programma con generare, e quindi con l'uso. Tuttavia, devo compilare ciascuna delle librerie con generate/use ecc. O solo il programma finale ? E se è solo l'ultimo programma, quando poi compilo con -fprofile-use ottimizzerà anche la funzionalità delle librerie?

Uguale a 2. Questi flag devono essere specificati per file di codice sorgente in modo che tutto il codice sia ottimizzato.

Si noti che, nel caso in cui non si abbia il codice sorgente, è comunque possibile collegare librerie statiche o dinamiche che non sono state ottimizzate con gli stessi flag e il codice funzionerà. Cioè, puoi combinare il codice che è ottimizzato a diversi livelli.

+1

In aggiunta a ciò, notare che -flto non interagisce con le librerie condivise a cui si sta collegando Si potrebbe eseguire l'ottimizzazione del tempo di collegamento quando si costruisce la stessa libreria condivisa in modo che possa beneficiare di flto quando viene creata, ma il proprio eseguibile i collegamenti a tale libreria condivisa non possono eseguire l'ottimizzazione del tempo di collegamento attraverso l'eseguibile e le librerie condivise a cui si collega. (Ma puoi farlo con le librerie statiche) – nos

Problemi correlati