2011-07-05 40 views
69

Me resulta extraño usar -Wl,-Bstatic para indicar a gcc con qué bibliotecas quiero vincular estáticamente. Después de todo, estoy diciendo gcc directamente toda la demás información sobre el enlace con las bibliotecas (-Ldir, -llibname).Indicando gcc directamente para vincular una biblioteca estáticamente

¿Es posible decirle al controlador gcc directamente qué bibliotecas deben vincularse estáticamente?

Aclaración: Sé que si existe una cierta biblioteca sólo en las versiones estáticas que va a utilizarlo sin -Wl,-Bstatic, pero quiero dar a entender gcc preferir la biblioteca estática. También sé que la especificación directa del archivo de la biblioteca se vincularía con él, pero prefiero mantener la semántica para incluir bibliotecas estáticas y dinámicas de la misma manera.

Respuesta

81

Es posible, por supuesto, utilizar -l: en lugar de -l. Por ejemplo, -l:libXYZ.a para vincular con libXYZ.a. Observe el lib escrito, a diferencia de -lXYZ que expandiría automáticamente a libXYZ.

+25

Dios si solo Gnu hubiera hecho esto el valor predeterminado en primer lugar en lugar de la locura del prefijo lib. Oh, el tiempo y la frustración que habríamos ahorrado. – Timmmm

+3

Radek, ¿está documentada esta opción '-l:'? ¿Qué versión de gcc necesito usar? – osgx

+4

En realidad, es una opción de 'ld' linker https://sourceware.org/binutils/docs/ld/Options.html" * '-l namespec' .. Si namespec tiene la forma: nombre de archivo, ld buscará ruta de la biblioteca para un archivo llamado filename, de lo contrario buscará en la ruta de la biblioteca un archivo llamado libnamespec.a ... en sistemas ELF .. ld buscará en un directorio una biblioteca llamada libnamespec.so antes de buscar una llamada libnamespec. a. Tenga en cuenta que este comportamiento no se aplica a: filename, que siempre especifica un archivo llamado filename. * ". Desde binutils 2.18 - https://sourceware.org/binutils/docs-2.18/ld/Options.html – osgx

89

Puede agregar .a archivo en el comando de vinculación:

gcc yourfiles /path/to/library/libLIBRARY.a 

Pero esto no es hablar con el conductor gcc, pero con ld enlazador como opciones como son -Wl,anything.

Cuando le dice a gcc o ld "-Ldir -lLIBRARY", el vinculador verificará las versiones estáticas y dinámicas de la biblioteca (puede ver un proceso con -Wl,--verbose). Para cambiar el orden de los tipos de biblioteca marcados, puede usar -Wl,-Bstatic y -Wl,-Bdynamic. Aquí es una página de manual de GNU ld: http://linux.die.net/man/1/ld

para enlazar su programa con LIB1, lib3 dinámica y LIB2 estáticamente, utilizar dicha llamada gcc:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3 

suponiendo que la configuración por defecto de LD es utilizar bibliotecas dinámicas (está en Linux).

+2

Versión corta: no hay forma de hacerlo con el 'gcc' actual. –

+3

Elazar Leibovich, pero 'gcc program.o -llib1 -Wl, -Bstatic -llib2 -Wl, -Bdynamic -llib3' hace el truco. – osgx

+0

Sí, pero la pregunta era específicamente cómo hacerlo SIN recurrir a las opciones directas de 'ld'. –

Cuestiones relacionadas