2009-12-27 13 views
5

disculpo porque por el momento no tengo el medio ambiente para experimentar y resolver las siguientes preguntas a mí mismo:Preguntas sobre enlazador de GCC

1) Digamos que tengo cuatro archivos de la biblioteca: libmylib_super.a y libmylib_super.so, mylib_dumb.a y mylib_dumb.so . Si bien la especificación de las bibliotecas para vincular a, ¿cuáles son las diferencias entre los siguientes enfoques:

A) -l:libmylib_super.a
B) -llibmylib_super
C) -lmylib_super
D) -lmylib_dumb

2) Definición de -static de la página hombre :

En los sistemas que admiten la vinculación dinámica , esto impide vincular ingenio h las bibliotecas compartidas. En otros sistemas , esta opción no tiene ningún efecto.

¿Tiene esta opción de enlazador algo que ver con la pregunta n. ° 1? O ... ¿por casualidad interferirán el uno con el otro?

Gracias.

--- --- editado 2009-12-28

acabo de recibir mi entorno y experimentar un poco, mediante la vinculación a impulsar fecha_hora biblioteca. Supongamos que tengo tres archivos de biblioteca: libboost_date_time-mt-d.a, libboost_date_time-mt-d.so.1.41.0, libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0 (enlace sym).

A.1) -l:libboost_date_time-mt-d.a ==> enlace OK, el binario funciona incluso sin el archivo de la biblioteca.
A.2) -l:libboost_date_time-mt-d.a con -static ==>vinculación de error/usr/bin/ld: cannot find -lm

C.1) -lboost_date_time-mt-d ==> une bien, las obras binarias sino que requiere el archivo de biblioteca compartida.
C.2) -lboost_date_time-mt-d con -static ==>vinculación de error/usr/bin/ld: cannot find -lm

Cualquier idea sobre el error en A.2 y C.2?

Además, mientras se ejecuta el programa en C.1, parece buscar el archivo de la biblioteca compartida con el nombre libboost_date_time-mt-d.so.1.41.0 pero no el libboost_date_time-mt-d.so. ¿No sería inconveniente si el programa se ejecuta en un sistema sin la versión exacta de la biblioteca? ¿Cuál podría ser la forma más práctica de manejar la versión al usar una biblioteca compartida?

Respuesta

9

Según el manual,

A) busca en la ruta de la biblioteca para un archivo con el nombre exactamente libmylib_super.a (la búsqueda por primera vez para un comportamiento biblioteca compartida no se aplica)

B) busca en la ruta de la biblioteca de un archivo llamado liblibmylib_super.so primero y luego liblibmylib_super.a o sólo busca un archivo llamado liblibmylib_super.a si se utiliza -static - tenga en cuenta que es el enlazador que se suma el lib prefijo y la extensión del archivo

C) busca en la ruta de la biblioteca para una archivo llamado libmylib_super.so primero y luego libmylib_super.a o sólo busca un archivo llamado liblibmylib_super.so si -static se utiliza

D) vea C)

Tenga en cuenta que B) no va a funcionar porque es el enlazador que debe añadir el prefijo lib a el nombre de la biblioteca.

Tenga en cuenta que D) no funcionará porque su mylib_dumb no sigue la convención de nomenclatura.

Véase el GNU Linker Manual:

namespec -l

--library = namespec

Añadir el archivo de almacenamiento u objeto especificado por namespec a la lista de archivos para vincular. Esta opción se puede usar cualquier cantidad de veces. Si namespec tiene el formato: nombre de archivo, ld buscará en la ruta de la biblioteca un archivo llamado nombre de archivo, de lo contrario buscará en la ruta de la biblioteca un archivo llamado libnamespec.a.

En sistemas que admiten bibliotecas compartidas, ld también puede buscar archivos que no sean libnamespec.a. Específicamente, en sistemas ELF y SunOS, ld buscará en un directorio una biblioteca llamada libnamespec.so antes de buscar una llamada libnamespec.a. (Por convención, una extensión .so indica una biblioteca compartida.) Tenga en cuenta que este comportamiento no se aplica a: nombre de archivo, que siempre especifica un archivo llamado nombre de archivo.

El vinculador buscará un archivo solo una vez, en la ubicación donde se especifica en la línea de comando. Si el archivo define un símbolo que no estaba definido en algún objeto que apareció antes del archivo en la línea de comando, el vinculador incluirá los archivos correspondientes del archivo. Sin embargo, un símbolo indefinido en un objeto que aparece más adelante en la línea de comando no hará que el vinculador busque nuevamente en el archivo.

Ver el - (opción para una manera de forzar al enlazador para buscar archivos en múltiples ocasiones

Es posible que la lista del mismo archivo varias veces en la línea de comandos

Este tipo de búsqueda del archivo es estándar.. para los enlazadores de Unix. Sin embargo, si está utilizando ld en AIX, tenga en cuenta que es diferente del comportamiento del enlazador AIX.

+0

Corrección: cuando '-estático' se especifica, solo' .a' se buscará , no '.so' – iamamac

+0

¡Uy sí, gracias! –

+0

Puede encontrar m Más información sobre las diversas opciones en este sitio web: http://gcc.gnu.org/onlinedocs/gcc/ –