2012-01-23 26 views
8

Si tengo dos bibliotecas, A.lib y B.lib, ambos de los cuales exportar foo y bar, ¿cómo le digo que el enlazador utilizar el símbolo de fooA.lib y el símbolo bar de B.lib?¿Cómo resolver las dependencias del vinculador en conflicto?

+0

¿Las bibliotecas en cuestión son bibliotecas estáticas o DLL? –

+0

@MichaelBurr: He encontrado todas las combinaciones posibles (estática/estática, estática/dinámica, dinámica/dinámica), así que espero que haya una solución para todas ellas. Pero si no lo hay, dinámico/dinámico es el más importante/útil para mí en este momento. – Mehrdad

+0

¿Puedes recompilar las bibliotecas? – sholsapp

Respuesta

3

No puede. Para su ejemplo, puede tener definiciones de foo.lib o bar.lib, pero no ambas (especialmente si no puede recompilar las bibliotecas y establecer la visibilidad de los símbolos para que solo se exporten los símbolos que desea). El orden en que los vincules con su aplicación dependerá de las definiciones de la biblioteca (tendrá que usar el método científico, creo que el primero vinculado gana). La respuesta de Niklas Hansson es una excelente manera de hacer esto de forma dinámica, pero parece que tampoco desea modificar la aplicación original para elegir/elegir dinámicamente qué símbolos sacar de las bibliotecas.

Si realmente lo desea, podría manipular las tablas de símbolos con un editor hexadecimal para que los símbolos que no desea exportar tienen tienen nombres diferentes (raro, pero funcionaría). Sé que en Linux hay una herramienta llamada objcopy que te permite hacer esto (no estoy seguro acerca de Windows).

1

Si está utilizando bibliotecas dinámicas, puede usar dynamic loading y seleccionar foo desde A y bar desde B al cargar.

+0

¿Cómo es relevante para resolver las ** dependencias conflictivas ** del vinculador? Simplemente me dice que evite introducir dependencias de tiempo de enlace en primer lugar ... – Mehrdad

+0

Bueno, prefiere evitar las dependencias de vinculador en conflicto cargando dinámicamente las funciones específicas que desea de cada biblioteca. –

3

Puede usar LIB.EXE /EXTRACT ... para extraer solo los archivos objeto que desea utilizar y vincular esos archivos a su propia aplicación.

O puede utilizar LIB para crear una nueva biblioteca que contiene los elementos que necesita:

  • primer lugar, utilice /REMOVE en A.LIB para eliminar bar.obj:
    LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
  • Luego combine A.LIB y B.LIB, y hacer Asegúrese de utilizar ANOBAR.LIB como el último en la línea de comando para asegurarse de que se usa foo.obj en lugar de B.LIB:
    LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB

Los detalles se encuentran aquí: Managing a library, especialmente el párrafo:

Puede utilizar LIB [...] Para sustituir a un miembro de la biblioteca con un nuevo objeto, especificar la biblioteca que contiene el miembro objeto a reemplazar y el nombre del archivo para el nuevo objeto (o la biblioteca que lo contiene). Cuando un objeto que tiene el mismo nombre existe en más de un archivo de entrada, LIB coloca el último objeto especificado en el comando LIB en la biblioteca de salida. Cuando reemplaza un miembro de la biblioteca, asegúrese de especificar el nuevo objeto o biblioteca después de la biblioteca que contiene el objeto anterior.

No probé las líneas de comando dadas, pero he usado otras similares en el pasado.

Cuestiones relacionadas