Decirle a gcc directamente que vincule una biblioteca estáticamente

133

Me resulta extraño usarlo -Wl,-Bstaticpara saber con gccqué bibliotecas quiero vincular estáticamente. Después de todo, estoy contando gccdirectamente 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 gccque 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.

Elazar Leibovich
fuente

Respuestas:

189

Es posible, por supuesto, usar en -l:lugar de -l. Por ejemplo -l:libXYZ.apara vincular con libXYZ.a. Observe lo libescrito, en lugar de a lo -lXYZque se expandiría automáticamente libXYZ.

Radek
fuente
63
Dios, si solo Gnu hubiera hecho esto por defecto en primer lugar en lugar de la locura del prefijo lib. Oh, el tiempo y la frustración que hubiéramos ahorrado.
Timmmm
9
Radek, ¿está -l:documentada esta opción? ¿Qué versión de gcc necesito para usar?
osgx
18
En realidad, es una opción de ldlinker 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.html
osgx
17
GNU no es responsable en ninguna parte de esta interfaz, fue heredada de la cadena de herramientas Unix.
akim
Es una lástima que esto no funcione en vinculadores que no sean GNU. Es una buena manera de "forzar" LDLIBS y opciones de configuración similares para encontrar bibliotecas estáticas sin soluciones extrañas de bandera de enlace.
nneonneo
130

Puede agregar un archivo .a en el comando de enlace:

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

Pero esto no está hablando con el controlador gcc, sino con el ldenlazador como opciones como -Wl,anythingson.

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,-Bstaticy -Wl,-Bdynamic. Aquí hay una página de manual de gnu LD: http://linux.die.net/man/1/ld

Para vincular su programa con lib1, lib3 dinámicamente y lib2 estáticamente, use dicha llamada gcc:

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

Suponiendo que la configuración predeterminada de ld es usar bibliotecas dinámicas (está en Linux).

osgx
fuente
3
Versión corta: no hay forma de hacerlo con current gcc.
Elazar Leibovich
77
Elazar Leibovich, pero gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3hace el truco.
osgx
13
La vinculación (y la búsqueda de bibliotecas dyn / static) se realiza mediante un vinculador, por lo tanto, debe usar las opciones del vinculador. -ly -Lson opciones de enlace también.
osgx
3
¿Esta respuesta ha sido votada por gcc yourfiles /path/to/library/libLIBRARY.ao -Wl,-Bstatic?
Tor Klingberg
77
@TorKlingberg, la variante 1 /path/to/library/libLIBRARY.anecesita una ruta completa para escribirse, la variante 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamices larga y agrega 2 opciones adicionales y asume el modo predeterminado como Bdynamic, y la variante aceptada 3 -l:libXYZ.aes 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.
osgx