Tenemos una base de código dividida en bibliotecas estáticas. Desafortunadamente, las bibliotecas tienen dependencias circulares; por ejemplo, libfoo.a
depende de libbar.a
y viceversa.Resolviendo dependencias circulares uniendo la misma biblioteca dos veces?
sé la forma "correcta" de manejar esto es usar --start-group
y --end-group
opciones del enlazador, así:
g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group
Pero en nuestros Makefiles existentes, el problema se maneja normalmente como esto:
g++ -o myApp -lfoo -lbar -lfoo
(Imagínese esto se extendió a ~ 20 bibliotecas con interdependencias complejas.)
he estado yendo a través ou r Makefiles cambia el segundo formulario al primero, pero ahora mis compañeros de trabajo me preguntan por qué ... Y aparte de "porque es más limpio" y una vaga sensación de que la otra forma es arriesgada, no tengo una buena respuesta.
Entonces, ¿puede unir la misma biblioteca varias veces alguna vez crear un problema? Por ejemplo, ¿podría fallar el enlace con símbolos definidos de forma múltiple si el mismo .o se extrae dos veces? ¿O hay algún riesgo de que podamos terminar con dos copias del mismo objeto estático, creando errores sutiles?
Básicamente, quiero saber si existe la posibilidad de que el tiempo de enlace o las fallas de tiempo de ejecución vinculen la misma biblioteca varias veces; y si es así, cómo activarlos. Gracias.
El único problema que se me ocurre es cuando logras vincular dos versiones diferentes de la misma biblioteca. Eso es difícil de hacer y (IMO) es poco probable que ocurra en Linux. Además, solo 20 bibliotecas no se parecen mucho. ¿Vale la pena caminar a través de makefiles? Podrías pasar ese tiempo haciendo otra cosa. – SigTerm
Este problema simplemente desaparece si arregla sus bibliotecas para que no tengan dependencias circulares. –
Supongo que eliminar las dependencias circulares al examinar y dividir las bibliotecas no es factible? Porque esa sería la forma más limpia –