erro ld "/opt/bin/ld: ignorando /lib/libm.so.6 incompatível ao procurar por /lib/libm.so.6" ao usar g++

erro ld "/opt/bin/ld: ignorando /lib/libm.so.6 incompatível ao procurar por /lib/libm.so.6" ao usar g++

Me deparo com este erro quando tento testar a compilação de um programa muito simples:

#ifdef __cplusplus
extern "C"
#endif
int
main ()
{
return 0;
}

E recebi a seguinte mensagem de erro se compilar 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

Mas a compilação passará pelo gcc:

gcc -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp

Observe que o sistema é um híbrido de 32 bits e 64 bits, todos os programas e bibliotecas de 32 bits estão em /lib, /bin ,/sbin etc. Todos os programas e bibliotecas de 64 bits estão em /opt/lib, /opt/bin, opt/sbin, etc. .Eu sei que /lib/libm.so.6 será a versão errada e a versão corrigida está em /opt/lib. Além disso, gcc, g++, ld são todos de 64 bits e estão nas subpastas /opt, e compilaram com sucesso outros programas muito complicados usando o gcc. O arquivo /lib/libm.so.6 é um link simbólico para /lib/libm-2.6.1.so; O arquivo /opt/lib/lim.so.6 é um link simbólico para /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.

Responder1

Como não consigo reproduzir o problema que você está enfrentando, só posso dar algumas dicas.

Veja issoresponder, pois o uso g++adiciona automaticamente algumas bibliotecas extras durante a fase do vinculador. Você pode usar a -vopção ao compilar/vincular para obter uma visão mais clara de quais bibliotecas estão sendo incluídas.

-v Imprima (na saída de erro padrão) os comandos executados para executar as etapas de compilação. Imprima também o número da versão do programa do driver do compilador e do pré-processador e do compilador propriamente dito.

À medida que g++o auto é adicionado libstdc++à fase do vinculador, observe onde ele é declarado em seu caminho.

$  ldconfig -p | grep stdc++
    libstdc++.so.6 (libc6,x86-64) => /usr/lib64/libstdc++.so.6
    libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6

informação relacionada