Domanda

Un po 'di contesto. Diciamo che ho file di origine, che devono finire in una libreria statica. Diciamo che ci sono due file CPP a.cpp e a.cpp Situato in due diverse sottodirectory. Qualcosa come questo:

foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp

Il loro contenuto non è scontro ed è completamente diverso. I nomi dei file sono solo gli stessi.

Ora, quando compila finisco con due a.o file ovviamente.

gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o

Se creo un Lib statico ora con

ar rcs libfoobar.a foo/a.o bar/a.o

Riesco a vedere entrambi i file all'interno della libreria statica in esecuzione nm libfoobar.a. Sembra a posto.

Problema

Il problema che posso vedere è se eseguo il ar comandare individualmente per foo/a.o e bar/a.o mettendoli nella stessa biblioteca statica. Ora quest'ultimo file di oggetti sovrascriverà il primo, quindi quando si esegue nm libfoobar.a Vedo solo quest'ultimo oggetto nella biblioteca. Immagino che questo sia il caso dovuto allo stesso nome del file oggetto.

Quando si crea una libreria statica con ar, se dovessi sempre combinare tutti gli oggetti in una volta o va bene ar Più volte raccoglie una parte di oggetti alla volta che finiscono nella stessa libreria statica? Per questo esempio posso vedere le opere precedenti, ma non le ultime.

Come funzionano le cose quando uno a.cpp I cambiamenti e la libreria statica devono cambiare? Volere ar Trova il diritto a.cpp cambiare in biblioteca?

Questo è solo un piccolo esempio, ma considera un grande progetto con molti file e alcuni hanno lo stesso nome. Se ora vuoi creare una sola libreria, potresti finire anche con questa situazione.

In generale, è solo una povera organizzazione di come sono composte le biblioteche, come i file sono nominati o c'è qualcos'altro per far funzionare le cose?

È stato utile?

Soluzione

Devi pensare ar come archivio di file molto vecchio. Non sa nemmeno nulla dell'archiviazione di una directory. (Gli archivi AR sono piatti)

(uomo AR): ar - create, modify, and extract from archives

uomo AR, opzione r:

r Inserire il membro dei file ... in archivio (con sostituzione). Questa operazione differisce da Q in quanto i membri precedentemente esistenti vengono eliminati se I loro nomi corrispondono a quelli che vengono aggiunti.

Prova a eseguire un ar t libfoobar.a E vedrai solo a.o file perché ar Non ho memorizzato il nome della directory nell'archivio.

Quindi è necessario nominare tutti i file di oggetti messi in archivio AR in modo diverso (UPD) Se si desidera eseguire un aggiornamento di alcuni file di oggetti in libreria con AR

Il ar rcs lib.a foo/a.o bar/a.o Fa una sostituzione di AO trovata in lib.A, ma non controlla i file aggiunti per la collisione dei nomi.

Altro caso: ar rcs lib.a foo/a.o e ar rcs lib.a bar/a.o Conserverò un primo AO in archivio, poi secondo ar troverà il più vecchio a.o in archivio e fa una sostituzione di un vecchio file.

Altri suggerimenti

Una libreria è solo una raccolta di funzioni e/o dati che sono stati raggruppati per file di oggetti all'interno della libreria e quei file di oggetti hanno un nome. Quei nomi non svolgono alcun ruolo diverso dall'aggiornamento /estrazione /rimozione di OT.

Pertanto è perfettamente legale avere due nomi identici per due o più file di oggetti. Quando si aggiorna la libreria, il bibliotecario sostituisce il primo oggetto con quel nome che stai sostituendo e non guarda oltre.

Non è una cosa intelligente da fare però.

Posso solo affrontare una parte della tua domanda. Dalla sintassi di Makefile vediamo che era un modo normale - per aggiornare un solo oggetto. Ma ad esempio l'approccio di Automake è ricostruire la libreria da zero anche se viene modificato un file. Adesso non rappresenta un grosso problema ...

Scusa, non ho a portata di mano UNIX in questo momento, quindi aspetteremo ancora che un esperto risponda :)

Dalla mia esperienza non consiglierei di avere due file con lo stesso nome in una libreria statica.

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