![Error de ld "/opt/bin/ld: omitiendo /lib/libm.so.6 incompatible al buscar /lib/libm.so.6" cuando se usa g++](https://rvso.com/image/83695/Error%20de%20ld%20%22%2Fopt%2Fbin%2Fld%3A%20omitiendo%20%2Flib%2Flibm.so.6%20incompatible%20al%20buscar%20%2Flib%2Flibm.so.6%22%20cuando%20se%20usa%20g%2B%2B.png)
Me encuentro con este error cuando intento compilar un programa muy simple:
#ifdef __cplusplus
extern "C"
#endif
int
main ()
{
return 0;
}
Y recibí el siguiente mensaje de error si compilo usando g++:
g++ -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
/opt/bin/ld: skipping incompatible /lib/libm.so.6 when searching for /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libmvec.so.1
Pero la compilación pasará por gcc:
gcc -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
Tenga en cuenta que el sistema es un híbrido de 32 bits y 64 bits, todos los programas y bibliotecas de 32 bits están en /lib, /bin,/sbin, etc. Todos los programas y bibliotecas de 64 bits están en /opt/lib, /opt/bin, opt/sbin, etc. Sé que /lib/libm.so.6 será la versión incorrecta y la versión corregida está en /opt/lib. Además, gcc, g++, ld son todos de 64 bits y están en las subcarpetas /opt, y han compilado exitosamente otros programas mucho más complicados usando gcc. El archivo /lib/libm.so.6 es un enlace simbólico a /lib/libm-2.6.1.so; El archivo /opt/lib/lim.so.6 tiene un enlace simbólico a /opt/lib/libm-2.22.so*
file /opt/lib/libm-2.22.so
/opt/lib/libm-2.22.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, for GNU/Linux 2.6.32, stripped
file /lib/libm-2.6.1.so
/lib/libm-2.6.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.8, stripped
g++ --version
g++ (OpenWrt GCC 4.8.5) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Respuesta1
Como no puedo reproducir el problema que tienes, sólo puedo darte algunos consejos.
Echa un vistazo a estorespuesta, ya que el uso g++
agrega automáticamente algunas bibliotecas adicionales durante la fase del vinculador. Puede usar la -v
opción al compilar/vincular para obtener una vista más clara de qué bibliotecas se incluyen.
-v
Imprime (en la salida de error estándar) los comandos ejecutados para ejecutar las etapas de compilación. Imprima también el número de versión del programa controlador del compilador y del preprocesador y del compilador propiamente dicho.
A medida que g++
se agrega automáticamente libstdc++
a la fase del vinculador, observe dónde se declara en su ruta.
$ ldconfig -p | grep stdc++
libstdc++.so.6 (libc6,x86-64) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6