una proceso librerias libreria instalar ejecutar dinamica crear compilar compilacion como gcc linker

gcc - proceso - instalar librerias de c en linux



Utilice bibliotecas estáticas y vinculadas dinámicamente en gcc (3)

Intente pasar las rutas a los archivos de la biblioteca a los que está vinculando en la línea de comandos del vinculador (ya sean .a o .so libraries) y drop -static. Eso debería hacer el truco.

Necesito distribuir un binario que se ejecutará en tantas distribuciones x86 de Linux como sea posible. Eso significa que tengo que vincular estáticamente algunas bibliotecas, como glibc, porque el usuario puede no tener la versión que uso. Se deben vincular dinámicamente otras bibliotecas, como fontconfig, porque se basa en un formato de archivo de caché y ubicaciones codificadas que pueden diferir en cada sistema.

¿Cuáles son las opciones de línea de comando para hacer esto? Si especifico -static, entonces gcc se negará a enlazar dinámicamente ninguna biblioteca.


Se debe tener en cuenta que, en Linux, solo puede (de manera segura) vincular estáticamente una biblioteca si ninguna de las bibliotecas dinámicas depende de ella. Esto significa que si está utilizando alguna biblioteca dinámica, puede olvidarse de vincular estáticamente libc. Solo use una versión bastante antigua para compilar contra el caso de libc; libc ha mantenido una fuerte compatibilidad ABI hacia atrás a lo largo de los años.


El enlace estático contra cualquier biblioteca de sistema, y ​​especialmente contra libc , en sistemas modernos UNIX o Linux hace que el binario sea significativamente menos portátil. Simplemente no lo hagas.

En su lugar, use compatibilidad hacia atrás (los binarios vinculados en un sistema anterior continúan ejecutándose en todos los más nuevos) para su ventaja, ya sea vinculando su binario en un sistema antiguo (uso RedHat 6.2, y no he visto un sistema Linux donde mi binario no se ejecutará en los últimos 8 años), o mediante el uso de algo así como autopackage (que se ha eliminado después de que se escribió esta respuesta).

Para responder a su pregunta original:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

hará que el vinculador use la versión de archivo de libfoo. [Es importante tener el final -Wl,-Bdynamic precisamente para que no fuerce la libc estática.]