Domanda

Il modo in cui si sviluppa il progetto di mia squadra, abbiamo generare una libreria oggetto condiviso per la nostra applicazione da tutti i tutti i nostri file oggetto .o. Il mio compito (si spera è sufficientemente specifica ma anche abbastanza generale di essere utile agli altri!) È quello di collegare in soli i file oggetto che sono stati modificati dopo l'ultima volta che l'eseguibile è stato creato. Ad esempio, qui è la riga di comando che io uso per costruire il .so:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

che funziona come previsto! :) Il mio obiettivo è quello di essere in grado di collegare in solo i file oggetto modificato da ora in poi, per accelerare il processo di collegamento simultaneo. Un comando esempio potrebbe essere:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

Il che aggiornare libMySharedLibrary.so con i file oggetto più recenti, pur mantenendo i file oggetto anziani libMySharedLibrary.so anche. In realtà, quando ho generare libMySharedLibrary.so utilizzando il comando di cui sopra, il file-size è molto più piccola di quella di quando tutti i file oggetto sono inclusi, in modo da poter quasi essere certi che il comando di cui sopra non sta facendo quello che voglio.

Attraverso le mie ricerche ho scoperto che c'è un'opzione -i per il linker che è la stessa come l'opzione -r, che sembra coniugare solo tutti i file oggetto in un unico file oggetto di grandi dimensioni come bene. Purtroppo non sembra che questo è quello che voglio.

In breve, vorrei link solo i file oggetto modificate dopo il collegamento iniziale, con conseguente più rapido processo di collegamento per i collegamenti futuri. C'è un modo per fare questo?

EDIT: Un esempio di quello che ho provato con -i/-r:

Esempio di comando: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

ho dovuto aggiungere il tag -nostdlib per impedirgli di urlare contro di me circa la necessità, e -shared rimosso perché gli oggetti condivisi non sono ammessi con il tag -r.

Questo comando sembrerebbe a sbattere tutti i miei file .o in un unico grande file .o. Quindi, se ho potuto solo aggiornare che .o file da qui in avanti con il solo cambiato .o file, che sarebbe grande. Dopo AllMyObjects.o è stato inizialmente creato, ho provato questo comando: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, ma sarebbe anche creare una molto più piccolo (file-formato-saggio) AllMyObjects.o, quindi sto supponendo che non può avere tutti i file oggetto. Mi sento come se questa è una cosa che sto probabilmente facendo un piccolo errore su. Qualcuno ha qualche consiglio? Grazie in anticipo.

È stato utile?

Soluzione

Sembra che tu abbia ragione su -shared e -r non lavorare insieme. Ero scettico riguardo la vecchia versione di GCC, ma anche su Ubuntu 10.10 posso vedere la stessa:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

Purtroppo, significa che hai raggiunto un vicolo cieco, se avete assolutamente bisogno di oggetti condivisi. Le binutils linker semplicemente non attuarlo.

Se le librerie statiche sono un'opzione per voi, sono semplicemente gli archivi che possono essere facilmente manipolati con l'utilità ar.

In caso contrario, si dovrà guardare ai diversi linker o suite del compilatore. Non posso garantire che troverete questa caratteristica, però, sembra esotico.

Altri suggerimenti

È possibile ordinare di ottenere il comportamento che stai dopo usando archivio librerie / statiche, ma il collegamento iniziale sarà ancora prendere la stessa quantità di tempo.

L'utilizzo di un file di archivio:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

Come ho detto, ci vorranno ancora la stessa quantità di tempo effettivamente collegare il .so come ha fatto prima.

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