c++ - Versiones GLIBCXX
linux portability (3)
- Esa es la versión de la biblioteca que está instalada en su sistema. Puedes construir manualmente la versión 3.4.14 de glibc y vincularla
- Eso depende. Tal vez la última versión solucionó algunos problemas. Los usuarios de su programa tendrían que vincularse con la versión que su programa requiere
- El uso de memoria es mayor
- Sí, pase el parámetro adecuado al enlazador. Si necesita una versión específica de la biblioteca, es mejor descargarla, compilarla manualmente y vincularla.
EDITAR
Acabo de recordar que las bibliotecas enlazadas estáticamente aumentan el uso de la memoria.
Si compilo un programa C ++ en mi máquina, y lo ejecuto en otro (con software anterior), obtengo: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9'' not found
.
De hecho, en mi sistema, glibc es más nuevo (tengo gcc-libs 4.5.1: libstdc ++. So.6.0.14) y strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
imprime desde GLIBCXX_3.4
a GLIBCXX_3.4.14
. En el otro sistema, en cambio, solo se imprime hasta GLIBCXX_3.4.8
(obtuve libstdc ++. So.6.0.8).
Así que tengo algunas preguntas:
¿Por qué mi vinculador vincula los binarios de C ++ con la versión libstdc ++
GLIBCXX_3.4.9
lugar deGLIBCXX_3.4.14
?Si cumpliera con mi binario contra la versión libstdc ++
GLIBCXX_3.4
, supongo que se ejecutaría en casi todas partes. ¿Eso implicaría algún tipo de problema? (por ejemplo: ¿usaría implementaciones de algoritmos más antiguas y, por lo tanto, peores?)Si, en cambio, enlace estáticamente mi programa con mi libstdc ++, supongo que se ejecutará en todas partes; el binario será mucho más grande (~ 1MB) por supuesto, cualquier otro pros / contras?
¿Puedo forzar al enlazador a vincular mi binario con una versión determinada de libstdc ++?
En mi opinión, si tus binarios no usan las nuevas características de la versión GLIBCXX más nueva, entonces no se vincularán con esa versión. Por lo tanto, sus binarios estaban vinculados con GLBCXX 3.4.9, debe haber al menos un símbolo exportado desde allí, y no hay símbolos exportados desde la versión más nueva que la 3.4.9.
Utilice readelf -a
y objdump -x
para inspeccionar los archivos ELF con preferencia a las strings
.
En realidad, todas las versiones de GLIBCXX_ * no se aplican a toda la biblioteca, sino a cada símbolo (versión de símbolo, vea DSO-howto ). Por lo tanto, puede tener, por ejemplo: std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5
y std::ios_base::Init::~Init()@@GLIBCXX_3.4
en el mismo archivo de biblioteca.
El hecho de que su programa necesite GLIBCXX_3.4.9 probablemente significa que se ha vinculado con un símbolo que se ha introducido / ha cambiado la semántica en GLIBCXX_3.4.9.