Вы упомянули libstdc++
в комментарии, что заставляет меня подозревать, что проблема в том, что вы связываетесь с g++
, а не с gcc
.
Команда gcc
вызывает компилятор и/или компоновщик. Если вы используете его для компиляции исходного файла, он обычно определяет язык (и, следовательно, какой интерфейс для компилятора использовать).
Команда g++
аналогична, но специализирована для C++; если он вызывает компоновщик, он передает аргументы по мере необходимости для связывания библиотек, таких как libstdc++
, которые необходимы для C++.
Например, эти две команды, которые просто компилировать без привязки:
gcc -c foo.cpp
g++ -c foo.cpp
являются (насколько я знаю), что эквивалентно, но эти команды:
gcc foo.cpp -o foo
g++ foo.cpp -o foo
нет; первый, вероятно, не сработает (в зависимости от того, какие функции использует foo.cpp
).
И получается, что команда g++
, в отличие от команды gcc
, неявно связывает математическую библиотеку, по крайней мере, в версии моей системы. Поэтому, если ваш код на C++ использует как C++-специфические функции (например, <iostream>
), так и математические функции, то привязка его к команде gcc
может вызвать жалобы на функции, определенные как в libstdc++
, так и в libm
- повторно посмотрев.
Если вы связываетесь с командой g++
, это должно решить проблему. Вероятно, вам придется изменить свой Makefile
или его эквивалент или что-то другое.
(Если это решение, вероятно, вы должны добавить «C++» в список тегов по вашему вопросу.)
Что касается того, почему вы раньше не сталкивались с этой проблемой, я не могу сказать. Некоторые C (и/или C++) компиляторы свяжут математическую библиотеку неявно; необходимость указывать -lm
для других компиляторов, возможно, является ошибкой.
Они представлены в libc IIRC. –
Подставка IIRC для перекрестных инструментов? – snyh
IIRC = «если я правильно помню» – Tim