La comodidad de instalar la mayorÃa de los programas «localmente» (con herramientas tipo apt, yum, zypper…) nos hace olvidar uno de los puntos débiles de Linux: la distribución de programas.
Cuando el código fuente está disponible y las dependencias son pocas, lo normal es que el programa se compile sin demasiados dolores de cabeza.
En otro caso, la cosa se complica. Lo habitual es compilar el programa para las distribuciones más comunes, y ofrecerlo para descarga en el formato de paquete correspondiente (.deb, .rpm…) O bien, montar un repositorio público que se pueda añadir a la lista de orÃgenes de paquetes.
En estos tiempos de tiendas de aplicaciones para todos, comienza a sonar raro lo de querer instalar un programa «a mano», pero es algo que al menos en Linux sigue siendo necesario. Por ejemplo, cuando careces de privilegios en un servidor remoto. Si el servidor tiene un entorno más o menos propicio a la compilación, suele bastar con bajarse el código y crear los binarios.
En este sentido, hay que reconocerle a Windows el mérito de soportar binarios de versiones antiguas (incluyendo bastante de la época MS-DOS). Siempre que no se recurriese a enlace dinámico (que lleva al famoso «dll hell»)
Algunas referencias para los valientes que quieran penetrar el mundillo de los binarios Linux portables:
- Creating portable Linux binaries (Insane Coding): integrar libstdc++, enlazar selectivamente de forma dinámica y estática, convivir con versiones diferentes de glibc
- On building portable Linux binaries (Sagar’s blog): Adding $ORIGIN to the rpath is an alternative
- Harmful : dynamic linking (cat -v)
- libc.so.6: version GLIBC_2.16 not found (Ask Ubuntu): convivir con varias versiones de glibc
# Origen: http://insanecoding.blogspot.in/2012/07/creating-portable-linux-binaries.html ldd app objdump -T app | grep GLIBC_ # enlace estático curl, ssl, crypto; dinámico zlib, dl, threads, rt gcc -o app *.o -static-libgcc -Wl,-Bstatic -lcurl -lssl -lcrypto -Wl,-Bdynamic -lz -ldl -lpthread -lrt # Origen: http://askubuntu.com/questions/315907/libc-so-6-version-glibc-2-16-not-found /catbed/ld-linux.so.3 --library-path=/catbed:/whatever-else /usr/bin/python -python-args
# como especificar parametros enlace estático en cmake # origen: http://cmake.3232098.n2.nabble.com/Howto-compile-static-executable-td5580269.html set(CMAKE_EXE_LINKER_FLAGS -static) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS) set(CMAKE_SHARED_LIBRARY_C_FLAGS) # remove -fPIC set(CMAKE_SHARED_LIBRARY_CXX_FLAGS) set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) # remove -rdynamic set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)