Error de ld "/opt/bin/ld: omitiendo /lib/libm.so.6 incompatible al buscar /lib/libm.so.6" cuando se usa g++

Error de ld "/opt/bin/ld: omitiendo /lib/libm.so.6 incompatible al buscar /lib/libm.so.6" cuando se usa g++

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 -vopció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

información relacionada