2009-09-17 3 views
3

По какой-то причине, когда я добавляю каталог FLTK в мой путь включения, я получаю кучу ошибок от cmath. Я использую GCC версии 4.2. Вот пример программы и выход сборки:cmath Ошибки при использовании FLTK

main.cpp

#include <cmath> 

int main() 
{ 
    return 0; 
} 

**** Build of configuration Debug for project CMath Test **** 

make -k all 
Building file: ../main.cpp 
Invoking: GCC C++ Compiler 
g++ -I/usr/include/FL -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" 
In file included from ../main.cpp:1: 
/usr/include/c++/4.2/cmath:100: error: ‘::acos’ has not been declared 
/usr/include/c++/4.2/cmath:116: error: ‘::asin’ has not been declared 
/usr/include/c++/4.2/cmath:132: error: ‘::atan’ has not been declared 
/usr/include/c++/4.2/cmath:148: error: ‘::atan2’ has not been declared 
/usr/include/c++/4.2/cmath:165: error: ‘::ceil’ has not been declared 
/usr/include/c++/4.2/cmath:181: error: ‘::cos’ has not been declared 
/usr/include/c++/4.2/cmath:197: error: ‘::cosh’ has not been declared 
/usr/include/c++/4.2/cmath:213: error: ‘::exp’ has not been declared 
/usr/include/c++/4.2/cmath:229: error: ‘::fabs’ has not been declared 
/usr/include/c++/4.2/cmath:245: error: ‘::floor’ has not been declared 
/usr/include/c++/4.2/cmath:261: error: ‘::fmod’ has not been declared 
/usr/include/c++/4.2/cmath:271: error: ‘::frexp’ has not been declared 
/usr/include/c++/4.2/cmath:287: error: ‘::ldexp’ has not been declared 
/usr/include/c++/4.2/cmath:303: error: ‘::log’ has not been declared 
/usr/include/c++/4.2/cmath:319: error: ‘::log10’ has not been declared 
/usr/include/c++/4.2/cmath:335: error: ‘::modf’ has not been declared 
/usr/include/c++/4.2/cmath:354: error: ‘::pow’ has not been declared 
/usr/include/c++/4.2/cmath:376: error: ‘::sin’ has not been declared 
/usr/include/c++/4.2/cmath:392: error: ‘::sinh’ has not been declared 
/usr/include/c++/4.2/cmath:408: error: ‘::sqrt’ has not been declared 
/usr/include/c++/4.2/cmath:424: error: ‘::tan’ has not been declared 
/usr/include/c++/4.2/cmath:440: error: ‘::tanh’ has not been declared 
make: *** [main.o] Error 1 
make: Target `all' not remade because of errors. 
Build complete for project CMath Test 

g++ -v 
Using built-in specs. 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7) 

Может кто-нибудь сказать мне, что случилось? Благодаря!

+0

Опубликовать вывод «g ++ -v» в вашей системе. –

+1

Похоже, что math.h отсутствует или что-то в этом роде. – GManNickG

ответ

3

Чистая спекуляция, но есть ли 'math.h' заголовок в /usr/include/FL, если это возможно? Или есть какой-то другой заголовок, который включен cmath?

[... немного времени проходит ...]

Тем не менее предположение, но, учитывая комментарий «Да, есть - то, что происходит», я буду спекулировать, что не существует никакого «математика .h 'в/usr/include - потому что если бы существовал GCC (G ++), как правило, поднимался бы с того же места, что и' '. Итак, я проверил бы установленное программное обеспечение - заголовки под/usr/include - для здравомыслия.

[... немного больше времени проходит ...]

Ах, ну ... мне кажется, что проблема заключается в том, что есть два math.h заголовки, и компилятор выбирает неправильный ,

Есть несколько трюков, которые вы можете попробовать. Во-первых, возможно, чтобы проверить документацию FLTK: вы должны использовать <FL/header.h> или просто <header.h> для доступа к своим заголовкам? Если вы должны использовать версию с подкаталогом, то вам не нужно добавлять -I/usr/include/FL в командную строку компиляции; ссылки на <FL/header.h> будут обрабатываться автоматически (путем поиска /usr/include/FL/header.h при сканировании /usr/include - точно так же, как <sys/types.h> находится под /usr/include).

Если это не является частью ответа, то вы можете попробовать использовать флаги:

-I/usr/include -I/usr/include/FL 

Это говорит «поиск /usr/include перед поиском /usr/include/FL (а затем искать /usr/include снова после поиска /usr/include/FL)». Это должно решить ближайшую проблему - однако это может вызвать проблемы с тем, что должно включать /usr/include/FL/math.h. Это определенно не так надежно, как первый вариант.

+0

Да, есть! Что происходит? – 2009-09-17 03:09:35

+0

Хорошо, спасибо вам, я понял это. В каталоге my/usr/include есть math.h, но приоритет имеет значение в/usr/include/FL. Я могу удалить math.h в/usr/include/FL, что решает проблему, но есть ли способ сказать компилятору явно, какой math.h использовать? – 2009-09-17 05:09:42

+0

Ах! Да, это была моя ошибка. Я должен делать «#include » и так далее. Таким образом, мой путь включения должен включать только/usr/include (Ha-ha). Спасибо за помощь. Это было очень тонко для меня. Надеюсь, я смогу диагностировать такую ​​проблему в будущем. – 2009-09-17 22:07:52

0

Скотт, добавьте -lm в список флагов линкера, и со мной все будет в порядке.

4

У меня была аналогичная проблема. Это было вызвано непреднамеренным созданием math.h в пути включения Qt Creator, создающего математическую подпакету для меня проекта, который скрыл файл math.h. Я нашел, что нужно просто сделать find/-name math.h. Конечно, это может занять некоторое время, но все они получают.

0

Я использую Qt Creator 3.3.0 и получили ту же проблему

Забавно, что я решил, переместив линию

#include < CMATH>

в верхнюю строку перед другими директивами #includes

Он решает мои проблемы !!!

Смежные вопросы