Estoy usando un sistema anterior que tiene gcc 2.95.3, tengo que vincular dos objetos que, aunque no tienen nada que ver entre sí, tienen cada uno métodos de nombre similar. No puedo cambiar el nombre de ninguno de ellos, pero espero que haya una forma de compilarlos para que el enlazador no se queje. Los métodos de los que se queja son llamados internamente por clases dentro del objeto. ¿Que puedo hacer?Cómo evitar "múltiples símbolos definidos" al vincular con gcc
5
A
Respuesta
9
Si tiene una cadena de herramientas GNU completo, usted debe ser capaz de evitar el problema con objcopy
, como esto (si he entendido su problema correctamente):
Éstos son dos objetos muy similares, "foo "y 'barra', ambos de los cuales exportar un símbolo denominado clash
- que se usa internamente, pero en realidad no necesitan ser exportados en absoluto:
$ cat foo.c
#include <stdio.h>
void clash(char *s) { printf("foo: %s\n", s); }
void foo(char *s) { clash(s); }
$
y
$ cat bar.c
#include <stdio.h>
void clash(char *s) { printf("bar: %s\n", s); }
void bar(char *s) { clash(s); }
$
Y aquí está el código principal, que quiere usar tanto:
$ cat main.c
extern void foo(char *s);
extern void bar(char *s);
int main(void)
{
foo("Hello");
bar("world");
return 0;
}
$
enlazándolos no funciona:
$ 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
$
lo tanto, utilizar objcopy
para cambiar la visibilidad de clash
en uno (o tanto, si se quiere) de los objetos:
$ objcopy --localize-symbol=clash bar.o bar2.o
$
ya se puede vincular con éxito con el objeto modificado - y el programa se comporta como! debería:
$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$
Cuestiones relacionadas
- 1. ¿Puede gcc usar múltiples núcleos al vincular?
- 2. ¿Cómo incluyo solo los símbolos usados al vincular estáticamente con gcc?
- 3. Biblioteca compartida C++ con plantillas: error de símbolos no definidos
- 4. símbolos no definidos: "_OBJC_CLASS_ $ error
- 5. Símbolos no definidos para la arquitectura armv7 al agregar CocoaAsyncSocket
- 6. símbolos no definidos para la arquitectura i386
- 7. Símbolos no definidos para la arquitectura i386:
- 8. símbolos no definidos para el error arquitectura
- 9. Error de compilación "Símbolos no definidos" en osx
- 10. Cargar múltiples símbolos usando csv con quantmod
- 11. Evitar múltiples columnas al imprimir FlowDocument
- 12. Cómo evitar los símbolos STT_GNU_IFUNC en tu binario?
- 13. Vincular con gcc y -lm no define ceil() en Ubuntu
- 14. Símbolos no definidos para la arquitectura i386: "_OBJC_CLASS _ $ _ MFMailComposeViewController"
- 15. Símbolos no definidos para la arquitectura armv7: "_SCNetworkReachabilityCreateWithAddress"
- 16. Ocultación de símbolos en bibliotecas estáticas compiladas con Xcode/gcc
- 17. Los símbolos de compilación condicional no están definidos
- 18. C-library sin vincular usando gcc/g ++
- 19. Cómo evitar que GCC se alinee
- 20. GCC Sin vincular las bibliotecas correctas
- 21. cómo vincular múltiples scripts de Python
- 22. Cómo evitar múltiples FI anidados
- 23. gcc vs. clang: extracción de símbolos
- 24. Evitar exportar símbolos desde ejecutables en Linux
- 25. símbolos no definidos para la arquitectura i386 "_OBJC_CLASS _ $ _ Appirater"
- 26. Uno o más símbolos se multiplican definidos encontraron
- 27. Cómo vincular un socket a múltiples interfaces
- 28. dlopen con dos bibliotecas compartidas, símbolos de exportación
- 29. ¿Cómo vincular correctamente xml al WPF DataGrid?
- 30. Fuerza para vincular con la biblioteca compartida no utilizada
¿Cómo puedo especificar local antes de que llegue a la forma de objeto? En el código idealmente, pero también tal vez como parte de la compilación de objetos? – CptanPanic
Si la función de conflicto solo se utiliza en un único archivo, no es necesario exportarla en absoluto, por lo que debería funcionar 'static '. Esto funcionaría con mi ejemplo trivial de arriba. (Supuse que no podía cambiar la fuente original, y necesitaba trabajar con los objetos, cuando dijo que no podía cambiar el nombre de las cosas). Si * necesita *, esos símbolos exportados para referencias entre objetos en una etapa de enlace anterior (e, g, que une un objeto parcial o una biblioteca), entonces las cosas serían más difíciles, y clasificarlas dependería de los detalles más finos del proceso de compilación. –