2016-10-20 2 views
0

Я установил VS 2015 Professional. Я установил последний HYPRE, из Лоуренса Ливермора website. Затем я настроил его с помощью CMake и начал строить, и я начал получать BLAS (dnrm2.c) ошибки построения:Ошибка сборки HYPRE с VS 2015

2>   dnrm2.c 
2>  1> 
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\math.h(454): error C2059: syntax error: '(' 

Строка кода запускающего ошибку в dnrm2.c является:

#include "math.h" 

, который указывает на файл:

c:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\math.h 

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

#include <cmath> 

и редактировать параметры HYPRE проекта в: Configuration > C/C++ > Advanced > Compile As к Compile As C++ (/TP)

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

#else /* _STD_USING */ 
#include <math.h> 
#endif /* _STD_USING */ 

Я даже попытался переустановить VS 2015 без везения (те же ошибки). Оцените любые идеи о том, что здесь происходит, и как это решить. Наверное, я мог бы попробовать минималистский пример в VS 2015, который включает в себя math.h и отчёт, если это поможет.

EDIT Мой минималистский пример:

#include "math.h" 

int main() { 
    double d1 = sqrt(4.0); 
    float d2 = abs(4.0); 
    return 0; 
} 

, как представляется, строительство OK. Я попытался установить проект таким же образом, как и в Cile (или C++, неважно). Это на самом деле мне не помогает.

+0

_I думаю, я мог бы попробовать минималистский пример в VS 2015, который включает в себя math.h и отчитаться, если это помогает: да, это определенно поможет. –

+0

@MichaelWalz: Я отредактировал сообщение, чтобы включить минималистский пример .. и он строит ОК. Так выглядит, как моя VS 2015 установка в порядке, и проблема HYPRE .. но что это может быть? –

ответ

0

ОК, проблема здесь в источнике HYPRE выглядит так. Они имеют это в файле f2c.h включен до включения math.h:

//#undef abs 
//#define abs(x) ((x) >= 0 ? (x) : -(x)) 
//#endif 

Когда я заметил это (так как это уже определено в стандарте), то он получает прошлое, строить ошибку. Конечно, я столкнулся с другими ошибками сборки. Я пытаюсь решить их отдельно.

EDIT: Это не так просто, потому что они (HYPRE) фактически полагаются на свое собственное определение abs. Таким образом, я отменил вышеупомянутое и изменил порядок некоторых включений, так что undef действительно имел смысл. В любом случае, это проблема с исходным кодом HYPRE.

0

Если вам удастся скомпилировать HYPRE на VS2015, не могли бы вы отправить мне программу VS2015! Мое главное - моделирование и инверсия геофизики. МОЙ адрес электронной почты: [email protected] Спасибо большое!

+0

Я описал свое решение ниже. Дайте мне знать, если это не поможет вам понять это. Я должен был внести некоторые кропотливые изменения. –

0

Я просто прокомментировал

_Check_return_ int  __cdecl abs(_In_ int _X); 

в

c:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\math.h 

, а затем HYPRE был успешно скомпилирован!

Затем я раскопал «абс».

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