2011-06-06 9 views
7

GCC puede ser bastante exigente con el orden en que se acepta sus argumentos:argumento de línea de comandos GCC pickiness

# Works. 
g++ Foo.cpp -L. -I. -lBar -o Foo 

# Linker errors. 
g++ -o Foo -I. -L. -lBar Foo.cpp 

Qué, específicamente, son los requisitos del pedido para las opciones de línea de comandos?

Respuesta

7

Las bibliotecas se cargan a pedido en función de los símbolos requeridos por ellas, por lo que la biblioteca que proporciona un símbolo que necesita otra cosa debe seguir esa otra cosa. Esto es histórico; podría decirse que un sistema moderno debería resolver los símbolos automáticamente, manejando los bucles de manera sensata (esa es la razón de la regla; rompió manualmente los ciclos de dependencia especificando las bibliotecas en orden y tantas veces como fuera necesario), pero g++ sigue la regla tradicional, por lo que funcionará vendedor ld s. (GNU ld no funciona en todas partes, por lo que no sería posible confiar en él para resolver bucles de dependencia de símbolos. También hay preocupaciones de arranque incluso en plataformas donde GNU ld funciona). Del mismo modo, otras opciones orientadas a enlazadores deben ser especificados en el orden correcto en relación con las cosas que afectan (por ejemplo, una opción -L debe preceder a una biblioteca que reside en el directorio especificado; esto puede ser importante si una biblioteca en un directorio sombrea una biblioteca del mismo nombre en un directorio estándar))

+0

Bootstrapping concerns? ¿Como que? – Maxpm

+1

Si 'gcc' /' g ++ 'dependía de un comportamiento específico de GNU' ld', tiene complicaciones en cuanto a lo que se necesita construir en qué orden para ejecutar la cadena de herramientas GNU. 'gcc' /' g ++ 'hace todo lo posible para compilar herramientas de proveedores estándar para fines de arranque, ya que muchos programas de GNU se basan en extensiones' gcc', y dependiendo de un comportamiento específico de '' ld' de GNU se rompería esto. – geekosaur

Cuestiones relacionadas