Sto usando un vecchio sistema che ha gcc 2.95.3, devo collegare in due oggetti che sebbene non abbiano nulla a che fare l'uno con l'altro, ognuno di essi ha metodi con nomi simili. Non posso rinominare nessuno dei due, ma spero che ci sia un modo per costruirli in modo da non lamentarsi del linker. I metodi a cui si lamenta sono chiamati internamente da classi all'interno dell'oggetto. Cosa posso fare?Come aggirare "più simboli definiti" nel collegamento con gcc
5
A
risposta
9
Se si dispone di un completo toolchain GNU, si dovrebbe essere in grado di aggirare il problema utilizzando objcopy
, come questo (se ho capito il problema in modo corretto):
Qui ci sono due oggetti molto simili, "foo "e 'bar', entrambi i quali esportare un simbolo chiamato clash
- che viene utilizzato internamente, ma in realtà non deve essere esportato a tutti:
$ cat foo.c
#include <stdio.h>
void clash(char *s) { printf("foo: %s\n", s); }
void foo(char *s) { clash(s); }
$
e
$ cat bar.c
#include <stdio.h>
void clash(char *s) { printf("bar: %s\n", s); }
void bar(char *s) { clash(s); }
$
Ed ecco il codice principale, che vuole utilizzare sia:
$ cat main.c
extern void foo(char *s);
extern void bar(char *s);
int main(void)
{
foo("Hello");
bar("world");
return 0;
}
$
collegandoli insieme non funziona:
$ gcc -Wall -c foo.c
$ gcc -Wall -c bar.c
$ gcc -Wall -c main.c
$ gcc -o test main.o foo.o bar.o
bar.o: In function `clash':
bar.c:(.text+0x0): multiple definition of `clash'
foo.o:foo.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
$
Quindi, utilizzare objcopy
per modificare la visibilità di clash
in uno (o entrambi, se si vuole) degli oggetti:
$ objcopy --localize-symbol=clash bar.o bar2.o
$
Ora è possibile collegare con successo con l'oggetto modificato - e il programma si comporta come! dovrebbe:
$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$
Problemi correlati
- 1. Gcc su OS X: simboli non definiti per l'architettura x86_64
- 2. gcc 4.2.1 Problema di collegamento: Simboli indefiniti per l'architettura x86_64
- 3. Objective-C - Simboli non definiti
- 4. simboli non definiti per QCompare
- 5. simboli non definiti per l'architettura i386: "_SCNetworkReachabilitySetCallback"
- 6. Poco C++ problemi di collegamento statiche con riferimenti non definiti ai simboli
- 7. Collegamento di problemi dovuti ai simboli con abi :: cxx11?
- 8. Simboli di compilazione condizionale non definiti
- 9. simboli non definiti per errore l'architettura
- 10. Simboli non definiti per la funzione constexpr
- 11. GCC 4.5 vs 4.4 collegamento con dipendenze
- 12. iPhone libxml2 simboli non definiti (con gdata, kissxml, touchxml, ecc.)
- 13. Come applicare l'opzione gcc -fvisibility ai simboli nelle librerie statiche?
- 14. Collegamento a framework Apple con gcc
- 15. La compilazione GCC ha riferimenti non definiti nonostante il collegamento funzionale in precedenza Ubuntu
- 16. simboli non definiti per l'architettura quando aggiungono AdMob
- 17. GCC - cambio della visibilità dei simboli
- 18. Come posso collegare (o aggirare) due librerie statiche di terze parti che definiscono gli stessi simboli?
- 19. simboli non definiti per l'architettura x86_64 ImageMagick su Mac Lion
- 20. Riferimenti non definiti nel makefile
- 21. La funzione inline nello spazio dei nomi genera simboli duplicati durante il collegamento su gcc
- 22. GCC non può lamentarsi di riferimenti non definiti?
- 23. Come determinare l'ordine di collegamento più veloce?
- 24. Trovare simboli non definiti in windows static lib
- 25. come ottenere parametri definiti nel file jasper?
- 26. Come rilevare in modo intelligente i simboli non definiti quando si collega un plugin su GNU/Linux?
- 27. Perché questo non crea più simboli definiti in questa libreria statica?
- 28. restituire valori come non definiti nel nodo
- 29. con collegamento <iostream.h> in linux con gcc
- 30. simboli non definiti per l'architettura ARMv7: "_OBJC_CLASS _ $ _ GGLContext", fa riferimento a: objc-class-ref nel AppDelegate.o
Come posso specificare locale prima che arrivi al modulo oggetto? Nel codice idealmente, ma forse anche come parte della compilazione di oggetti? – CptanPanic
Se la funzione di contrasto è utilizzata solo in un singolo file, non è necessario che sia esportata, quindi è necessario che 'static' funzioni. Ciò funzionerebbe con il mio esempio banale sopra. (Supponevo che tu non potessi cambiare la fonte originale e che invece avessi bisogno di lavorare con gli oggetti, quando hai detto che non potevi rinominare le cose.) Se * fai * bisogno di quei simboli esportati per i riferimenti tra oggetti in una fase di collegamento precedente (e, g, collegando un oggetto parziale o una libreria), le cose sarebbero più difficili e l'ordinamento dipenderà dai dettagli più fini del processo di compilazione. –