linux - mp3tag - puddletag
¿Por qué importa el orden en que se especifican las bibliotecas de entrada? (3)
Soy bastante nuevo en la programación de Linux. Podrías decir que soy un chico de Windows. Entonces, estaba transfiriendo mi proyecto a Linux, y casi me volvió loco: estoy seguro de que he especificado todas las dependencias con -l flag y, sin embargo, estoy obteniendo errores de "símbolo no resuelto". Luego encontré este tema y resolvió mi problema: Boost linking en Linux con GCC
¿Podría alguien explicarme por qué importa el orden y qué importancia tiene? Estoy bastante seguro de que no es el caso con el enlazador MSVC ...
De " Una introducción a GCC - para los compiladores de GNU gcc y g ++ "
El comportamiento tradicional de los enlazadores es buscar funciones externas de izquierda a derecha en las bibliotecas especificadas en la línea de comandos. Esto significa que una biblioteca que contiene la definición de una función debe aparecer después de cualquier archivo fuente o archivo de objeto que lo use.
Creo que los enlazadores de msvc hacen 2 pasadas sobre el código para que puedan resolver los símbolos incluso cuando las bibliotecas se especifican en diferente orden (falta la referencia ...)
Es la forma en que funcionan los enlazadores Unix, desde hace mucho tiempo ... Ver el libro de Levine
Un simple ejemplo le permitirá ver por qué los enlazadores Unix de un paso se preocupan por el orden.
Supongamos que tiene main.o (generado por main.cpp) y las bibliotecas libx.a (sin dependencias) y liby.a (depende de libx llamado newRefX) .
Si el enlazador va en este orden, está bien ya que el enlazador va del 1 al 3:
- main.o refX = undef, refY = undef
- liby.a refX = undef, refY = def, newRefX = undef
- libx.a refX = def, refY = def, newRefX = def
Pero si el enlazador va en este orden, se encontrará con problemas con newRefX:
- main.o refX = undef, refY = undef
- libx.a refX = def, refY = undef,
- liby.a refX = def, refY = def, newRefX = undef
Entonces, puede ver que desea la última biblioteca de nivel (la que no depende de ninguna otra).