![ld-Fehler „/opt/bin/ld: Inkompatibles /lib/libm.so.6 wird beim Suchen nach /lib/libm.so.6 übersprungen“ bei Verwendung von g++](https://rvso.com/image/83695/ld-Fehler%20%E2%80%9E%2Fopt%2Fbin%2Fld%3A%20Inkompatibles%20%2Flib%2Flibm.so.6%20wird%20beim%20Suchen%20nach%20%2Flib%2Flibm.so.6%20%C3%BCbersprungen%E2%80%9C%20bei%20Verwendung%20von%20g%2B%2B.png)
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 -v
Option 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