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 foo
A.lib
y el símbolo bar
de B.lib
?¿Cómo resolver las dependencias del vinculador en conflicto?
Respuesta
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).
Si está utilizando bibliotecas dinámicas, puede usar dynamic loading y seleccionar foo
desde A y bar
desde B al cargar.
¿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
Bueno, prefiere evitar las dependencias de vinculador en conflicto cargando dinámicamente las funciones específicas que desea de cada biblioteca. –
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
enA.LIB
para eliminarbar.obj
:
LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
- Luego combine
A.LIB
yB.LIB
, y hacer Asegúrese de utilizarANOBAR.LIB
como el último en la línea de comando para asegurarse de que se usafoo.obj
en lugar deB.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.
- 1. ILSpy, cómo resolver dependencias?
- 2. ¿Cómo resolver el conflicto de fusión del archivo xib?
- 3. ¿Cómo resolver un conflicto con git-svn?
- 4. Resolver "CONFLICTO (eliminar/modificar)" en git
- 5. ¿Cómo puedo resolver este conflicto de git?
- 6. Java: resolver el conflicto del espacio de nombres
- 7. Cómo resolver un conflicto en JetGradle en IntelliJ IDEA 11.1.2?
- 8. Cómo resolver el conflicto de simultaneidad en ado.net
- 9. ¿Cómo rastrear las dependencias del sistema?
- 10. Cómo resolver "borrar/modificar" conflicto causado por "escondite git aplica"
- 11. Las dependencias de Maven no se pueden resolver
- 12. Problema al resolver un conflicto shift-reduce en mi gramática
- 13. error de vinculador 'símbolo externo sin resolver': trabajar con plantillas
- 14. Banderas del vinculador en el lugar equivocado
- 15. Maven No se pudieron resolver las dependencias, los artefactos no se pudieron resolver
- 16. Cómo prevenir experto para resolver dependencias de repositorio local
- 17. ¿Cómo puedo resolver un conflicto de combinación con las propiedades de SVN?
- 18. Dependencia-inyección para resolver dependencias circulares
- 19. Manejo del conflicto SVN
- 20. ¿Cómo sabe el vinculador qué símbolos se deben resolver en el tiempo de ejecución?
- 21. ¿Cómo ordenar según las dependencias?
- 22. MPI y D: Opciones del vinculador
- 23. vinculador del manejador de eventos wpf en estilo
- 24. ¿Cómo resolver las dependencias de Apache Ivy cuando está desconectado/desconectado?
- 25. No se puede resolver el conflicto del árbol con el SVN
- 26. ¿Cómo manejan oozie las dependencias?
- 27. ¿Cómo lidiar con dependencias recursivas entre bibliotecas estáticas usando el vinculador binutils?
- 28. ¿Cómo puedo gestionar las dependencias del módulo Perl?
- 29. ¿Cómo se actualizan las dependencias de maven del eclipse?
- 30. ¿Cómo manejas las grandes dependencias en Boost?
¿Las bibliotecas en cuestión son bibliotecas estáticas o DLL? –
@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
¿Puedes recompilar las bibliotecas? – sholsapp