ld-Fehler „/opt/bin/ld: Inkompatibles /lib/libm.so.6 wird beim Suchen nach /lib/libm.so.6 übersprungen“ bei Verwendung von g++

ld-Fehler „/opt/bin/ld: Inkompatibles /lib/libm.so.6 wird beim Suchen nach /lib/libm.so.6 übersprungen“ bei Verwendung von g++

Beim Versuch, die Kompilierung eines sehr einfachen Programms zu testen, tritt dieser Fehler auf:

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

Und ich bekomme die folgende Fehlermeldung, wenn ich mit g++ kompiliere:

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

Aber die Kompilierung durch gcc läuft:

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

Beachten Sie, dass das System ein Hybrid aus 32-Bit und 64-Bit ist. Alle 32-Bit-Programme und -Bibliotheken befinden sich in /lib, /bin, /sbin usw. Alle 64-Bit-Programme und -Bibliotheken befinden sich in /opt/lib, /opt/bin, opt/sbin usw. Ich weiß, dass /lib/libm.so.6 die falsche Version ist und die korrigierte Version in /opt/lib liegt. Außerdem sind gcc, g++ und ld alle 64-Bit und in den Unterordnern /opt und haben mit gcc erfolgreich andere, viel kompliziertere Programme kompiliert. Die Datei /lib/libm.so.6 ist ein symbolischer Link zu /lib/libm-2.6.1.so; die Datei /opt/lib/lim.so.6 ist ein symbolischer Link zu /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.

Antwort1

Da ich Ihr Problem nicht reproduzieren kann, kann ich Ihnen nur einige Hinweise geben.

Guck dir das anAntwort, da die Verwendung g++während der Linkerphase automatisch einige zusätzliche Bibliotheken hinzufügt. Sie können die -vOption beim Kompilieren/Linken verwenden, um einen klareren Überblick darüber zu erhalten, welche Bibliotheken einbezogen werden.

-v Drucken Sie (auf der Standardfehlerausgabe) die Befehle aus, die zum Ausführen der Kompilierungsschritte ausgeführt wurden. Drucken Sie auch die Versionsnummer des Compiler-Treiberprogramms sowie des Präprozessors und des eigentlichen Compilers.

Da „Auto“ zur Linker-Phase g++hinzugefügt wird , schauen Sie nach, wo es in Ihrem Pfad deklariert ist.libstdc++

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

verwandte Informationen