Me resulta extraño usarlo -Wl,-Bstatic
para saber con gcc
qué bibliotecas quiero vincular estáticamente. Después de todo, estoy contando gcc
directamente toda otra información sobre el enlace con bibliotecas ( -Ldir
, -llibname
).
¿Es posible decirle al controlador gcc directamente qué bibliotecas deberían estar vinculadas estáticamente?
Aclaración: Sé que si una determinada biblioteca existe solo en versiones estáticas, la usará sin ella -Wl,-Bstatic
, pero quiero implicar gcc
que prefiero la biblioteca estática. También sé que especificar el archivo de la biblioteca directamente se vincularía con él, pero prefiero mantener la semántica para incluir las bibliotecas estáticas y dinámicas de la misma manera.
fuente
-l:
documentada esta opción? ¿Qué versión de gcc necesito para usar?ld
linker sourceware.org/binutils/docs/ld/Options.html "-l namespec
.. Si namespec tiene la forma: nombre de archivo, ld buscará en la ruta de la biblioteca un archivo llamado nombre de archivo, de lo contrario buscará en la biblioteca ruta de acceso para un archivo llamado libnamespec.a. .. en los sistemas ELF .., ld buscará en un directorio una biblioteca llamada libnamespec.so antes de buscar uno llamado libnamespec.a ... Tenga en cuenta que este comportamiento no se aplica a: filename , que siempre especifica un archivo llamado nombre de archivo ". Desde binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.htmlPuede agregar un archivo .a en el comando de enlace:
Pero esto no está hablando con el controlador gcc, sino con el
ld
enlazador como opciones como-Wl,anything
son.Cuando le dice a gcc o ld
-Ldir -lLIBRARY
, el enlazador 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í hay una página de manual de gnu LD: http://linux.die.net/man/1/ldPara vincular su programa con lib1, lib3 dinámicamente y lib2 estáticamente, use dicha llamada gcc:
Suponiendo que la configuración predeterminada de ld es usar bibliotecas dinámicas (está en Linux).
fuente
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
hace el truco.-l
y-L
son opciones de enlace también.gcc yourfiles /path/to/library/libLIBRARY.a
o-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
necesita una ruta completa para escribirse, la variante 2-Wl,-Bstatic -llib2 -Wl,-Bdynamic
es larga y agrega 2 opciones adicionales y asume el modo predeterminado como Bdynamic, y la variante aceptada 3-l:libXYZ.a
es corta y simplemente funciona. Los tres funcionarán para muchos casos, y la variante 2 puede no funcionar al vincular programas estáticos. El paso de vinculación real para la lib es el mismo en todas las variantes, según tengo entendido.