Si estás desarrollando en C++ utilizando una versión muy moderna del compilador, cuando ejecutas tu código en versiones más antiguas de linux (normalmente puede pasar en servidores que por estabilidad suelen estar menos actualizados) puedes encontrarte con errores de este tipo:
bin/blabla: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by bin/blabla)
bin/blabla: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by bin/blabla)
Esto ocurre porque el código compilado utiliza versiones más modernas de la librería estándar. Si te encuentras en esta situación pensarás "vaya faena" o "voy a tener que compilar mi código con un compilador más antiguo, vaya faena...". Lo cierto es que una solución podría ser esa, compilar y generar tu binario con un compilador más antiguo.
Aunque hay otra forma más fácil, que consiste en especificar la versión del Application binary interface que nuestra máquina destino (la que se supone que tiene una versión más antigua del compilador y librerías estándar) puede manejar (o entender), esto se hace utilizando el flag de compilación (CXXFLAGS) -fabi-version=n.
En el caso que me he encontrado, tenía como máquina de compilación gcc (GCC) 4.4.6 y de ejecución gcc (GCC) 4.1.2 y me ha sido suficiente con poner la versión 3. Aquí puedes encontrar información sobre la compatibilidad entre versiones de gcc y sus librerías estándar:
1
2
3
4
5
6
7
8
9
10 | # si utilizamos autotools como herramienta de construcción
# es suficiente con especificarlo en la varible CXXFLAGS
./configure CXXFLAGS=-fabi-version=3
# si no, en el makefile
make CXXFLAGS="-fabi-version=3" clean all
#o directamente en el compilador,
# que es el que realmente recibe este parámetro
g++ -fabi-version=3 main.cpp
|