Ho due file 37064544_p1.cpp
& 37064544_p2.cpp
con lo stesso contenuto come illustrato di seguito:Come vengono risolti i simboli esterni?
int add(int x,int y)
{
return x+y;
}
li ho compilato utilizzando
g++ -c 37064544_p2.cpp -o 37064544_p2.o
g++ -c 37064544_p2.cpp -o 37064544_p2.o
e li ha aggiunto a un archivio utilizzando
ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o
E
$ nm -s lib37064544pf.a
mi da:
Archive index:
_Z3addii in 37064544_p1.o
_Z3addii in 37064544_p2.o
37064544_p1.o:
0000000000000000 T _Z3addii
37064544_p2.o:
0000000000000000 T _Z3addii
e
$ ar -t lib37064544pf.a
mi dà
37064544_p1.o
37064544_p2.o
ho un autista, che chiama la funzione _Z3addii
che viene compilato con
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf
risultato è
Sum : 11
Domande
Come è il simbolo
_Z3addii
risolti?- Secondo l'indice di archivio?
- È in base all'ordine in cui popoliamo l'archivio utilizzando
ar
?
Come posso modificare questo ordine?
- Come impedire a
ar
di avere simboli duplicati?
Compiler: g ++ 4.6.3
Hmm, ho appena provato questo su clang. Se si compila direttamente con i due file .o si ottiene un errore di simbolo duplicato, ma se si inseriscono i due file .o in un file .a e si compila contro di essi, non si verifica alcun errore. Ho sempre pensato che un .a fosse solo un modo conveniente per avere un sacco di file .o, ma sembra che sia diverso in qualche modo. – xaxxon
Il flag "r" su ar sembra che significhi che le cose aggiunte all'archivio in seguito sostituiranno quelle precedenti, sebbene eseguendo con q invece, non riesco ancora a ottenere un errore di simbolo duplicato. Il linker smette di guardare un singolo file quando trova la prima voce per un simbolo che sta cercando forse? – xaxxon
@xaxxon: 'Se si compila direttamente con i due file .o si ottiene un errore di simbolo duplicato,'. Sì, ma non sono sempre a favore di questo per convenienza – sjsam