2012-01-26 23 views
8

decir que tengo dos bibliotecas estáticas que no fueron construidas por mí y no tengo ningún control sobre su contenido.impedir la importación de la función de la biblioteca estática

Biblioteca 1 tiene funciones:

A() 
B() 
C() 

Biblioteca 2 tiene funciones:

A() 
D() 
E() 

Ambos necesitan ser vinculado en una aplicación de llamada pero el conflicto de nombres de A() tiros errores.

¿Hay una manera de decir "Ignorar A() de la biblioteca 1 al vincular" en Linux a través de gcc y ld.

+0

Probablemente vale la pena mencionar su cadena de herramientas. Lo usual, GNU gcc y ld? – Thomas

+0

Se agregó, está en GCC y ld. – tpg2114

Respuesta

6

Hay un par de métodos, que yo sepa:

  1. se puede hacer una copia de la biblioteca que tiene el símbolo correspondiente oculta, y el enlace con la copia. No necesita acceder a ninguna fuente para que el código de la biblioteca haga esto: objcopy puede hacerlo con la opción --localize-symbol. Describo cómo hacer esto con .o archivos en this answer a una pregunta similar, pero el mismo método funciona igual de bien con .a bibliotecas.

  2. El --allow-multiple-definition option podrían utilizarse. (Si va a enlazar a través de un comando gcc, en lugar de con ld directamente, tendrá que especificar la opción como -Wl,--allow-multiple-definition.) Esto hará que el enlazador para detener preocuparse por la definición múltiple, y simplemente utiliza el primero que se encuentra en su lugar, por lo que debe tener cuidado con el orden en que aparecen las bibliotecas en la línea de comando. La desventaja es que se trata de una opción global, por lo que si tiene otros enfrentamientos de símbolos inesperados, podría hacer algo incorrectamente en lugar de informarle al respecto.

Cuestiones relacionadas