![ошибка ld "/opt/bin/ld: пропуск несовместимого /lib/libm.so.6 при поиске /lib/libm.so.6" при использовании g++](https://rvso.com/image/83695/%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%20ld%20%22%2Fopt%2Fbin%2Fld%3A%20%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%20%D0%BD%D0%B5%D1%81%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE%20%2Flib%2Flibm.so.6%20%D0%BF%D1%80%D0%B8%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B5%20%2Flib%2Flibm.so.6%22%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20g%2B%2B.png)
Я сталкиваюсь с этой ошибкой, когда пытаюсь протестировать компиляцию очень простой программы:
#ifdef __cplusplus
extern "C"
#endif
int
main ()
{
return 0;
}
И я получил следующее сообщение об ошибке при компиляции с использованием 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
Но компиляция пройдет мимо gcc:
gcc -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
Обратите внимание, что система представляет собой гибрид 32- и 64-битной систем, все 32-битные программы и библиотеки находятся в /lib, /bin ,/sbin и т. д. Все 64-битные программы и библиотеки находятся в /opt/lib, /opt/bin, opt/sbin и т. д. Я знаю, что /lib/libm.so.6 будет неправильной версией, а исправленная версия находится в /opt/lib. Кроме того, gcc, g++, ld — все 64-битные и находятся в подпапках /opt, и успешно скомпилировали другие гораздо более сложные программы с помощью gcc. Файл /lib/libm.so.6 — это символическая ссылка на /lib/libm-2.6.1.so; Файл /opt/lib/lim.so.6 — это символическая ссылка на /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.
решение1
Поскольку я не могу воспроизвести проблему, с которой вы столкнулись, я могу лишь дать вам несколько советов.
Посмотри на этоотвечать, так как использование g++
автоматически добавляет некоторые дополнительные библиотеки во время фазы компоновки. Вы можете использовать эту -v
опцию при компиляции/линковке, чтобы получить более четкое представление о том, какие библиотеки включаются.
-v
Вывести (на стандартный вывод ошибок) команды, выполненные для запуска этапов компиляции. Также вывести номер версии программы драйвера компилятора и препроцессора и самого компилятора.
Поскольку g++
auto добавляется 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