В xcode при включении cmath выдается ошибка: «:: acos» не был объявлен и т. Д. - PullRequest
7 голосов
/ 15 октября 2010

При попытке создать небольшой и простой проект, включающий <cmath> в Xcode, я получаю следующие ошибки:

cmath: '*' has not been declared
'::acos' has not been declared
In file included from /Xcode4/Projects/libraryLAFMath/Classes/libraryLAFMath.cp
In file included from /Xcode4/Projects/libraryLAFMath/Classes/libraryLAFMath.h
'::acos' has not been declared in /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/usr/include/c++/4.2.1/cmath
...

Журнал ошибок также содержит жалобы на все остальные математические функции, sin, pow и т. Д., А не только acos.Я заглянул внутрь cmath исходного кода, и он ссылается на глобально определенные соответствующие математические функции из math.h, то есть ::acos и т. Д. Так как ошибка корня жалуется на отсутствие ::acos, можно предположить, что math.h можетне может быть найден, но а) он существует, и б) я получил бы другую ошибку, жалуясь, что math.h не может быть найден.

Исходный код выглядит следующим образом:

libraryLAFMath.cp:

#include "libraryLAFMath.h"

libraryLAFMath.h:

#include <cmath>
struct libraryLAFMath {
    void test() {
        double a = std::acos(0);
    }
};

Теперь у меня есть другой проект из внешнего источника, который использует cmath и прекрасно компилируется.Я попытался сравнить настройки сборки между этими двумя проектами, но они почти одинаковы.Я использую компилятор LLVM GCC 4.2, но получаю аналогичный результат при использовании GCC 4.2, так что я считаю, что это не проблема настроек компилятора.

Я новичок в разработке Xcode, и любая помощь приветствуется.

Ответы [ 2 ]

13 голосов
/ 15 октября 2010

В моем проекте есть файл с именем Math.h с большой буквы M, и кажется, что компилятор запутался и пытается включить Math.h вместо math.h.

2 голосов
/ 24 сентября 2013

Я опубликовал этот ответ в альтернативной теме по теме, но подумал, что стоит включить и здесь:

У меня была эта проблема - она ​​сводила меня с ума, но я нашел причину, и она немного отличалась от того, что я видел по этой проблеме.

В этом случае общий заголовок cmath (или math.h - ошибка и решение возникают в C ++ или C) имели переключатели архитектурной среды для включения специфических для архитектуры подзаголовков математики. Переключатель архитектуры (переменная окружения) не был определен, поэтому он включал заголовок, который фактически не включал заголовки, которые действительно определяли математические функции.

Таким образом, действительно был один файл math.h или cmath.h, и он был включен, но этого было недостаточно, чтобы получить математические функции. В моем случае, вместо того, чтобы определять архитектурную переменную, я вместо этого нашел расположение правильных подматематических заголовков и добавил их в мой путь компиляции. Тогда проект работал!

Это, похоже, проблема, которая часто возникает при портировании проектов Linux на OS-X. Я мог бы предположить, что это может произойти в любое время, когда проект был перемещен между платформами так, что заголовки стандартной библиотеки расположены по-разному.

...