
Я сталкиваюсь с этой ошибкой, когда пытаюсь протестировать компиляцию очень простой программы:
#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