ошибка ld "/opt/bin/ld: пропуск несовместимого /lib/libm.so.6 при поиске /lib/libm.so.6" при использовании g++

ошибка ld "/opt/bin/ld: пропуск несовместимого /lib/libm.so.6 при поиске /lib/libm.so.6" при использовании g++

Я сталкиваюсь с этой ошибкой, когда пытаюсь протестировать компиляцию очень простой программы:

#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

Связанный контент