ld erro “/ opt / bin / ld: ignorando /lib/libm.so.6 ao procurar por /lib/libm.so.6” ao usar g ++

0

Eu me deparo com esse 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 eu 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

Note que o sistema é um híbrido de 32 bits e 64 bits, todos os programas de 32 bits e libararies estão em / lib, / bin, / sbin etc. Todos os programas e liberações do 64bits estão em / opt / lib, / opt / bin, opt / sbin, etc. Eu sei que o /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 64bits e 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.
    
por NathaneilCapital 16.02.2016 / 10:49

1 resposta

1

Como não consigo reproduzir o problema, só posso dar algumas dicas.

Dê uma olhada nesta resposta , pois usar g++ adiciona automaticamente algumas bibliotecas extras durante a fase de vinculação. Você pode usar a opção -v ao compilar / vincular para obter uma visão mais clara de quais bibliotecas estão sendo incluídas.

-v Print (on standard error output) the commands executed to run the stages of compilation. Also print the version number of the compiler driver program and of the preprocessor and the compiler proper.

Como g++ auto adiciona 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
    
por 09.03.2016 / 16:33

Tags