Код C ++ / LapackE прекрасно компилируется в Windows, но идентичный код не компилируется в Linux

Код, написанный на C ++ с библиотеками LapackE и MPI, компилируется и отлично работает в Windows, где я использую GNU C ++ 4.9.2.

Перенос этого кода на сервер Linux (CentOS) не компилируется! GNU C ++ на Linux-машине — это 4.4.7. Я использовал идентичные заголовочные файлы LapackE в обоих случаях. MPI хорошо работает на Linux-машине.

После проверки выходных файлов препроцессора на обеих машинах я могу связать сообщения об ошибках со следующими ситуациями, когда сложный объявления в исходном коде были заменены _Сложный. Вот пример объявления сложного динамического массива HAMILTONIAN, который имеет проблему при компиляции в Linux:

В ОРИГИНАЛЬНОМ ИСТОЧНИКЕ:
lapack_complex_double * HAMILTONIAN;

В ОКНА ПРЕДВАРИТЕЛЬНО. ФАЙЛ (работает хорошо):
_lapack_complex_double * HAMILTONIAN;

В LINUX PREPROC. ФАЙЛ (не компилируется):
двойной _комплекс * гамильтониан;

Может ли это быть проблемой, связанной с различными версии из GCC?

я пробовал #define _Комплексный комплекс но это не помогло в конце.

Некоторые сообщили о проблеме с совместимостью C99 _Complex и C ++ complex: возможна похожая проблема.

Пожалуйста помоги. Спасибо!

-1

Решение

он компилируется нормально, даже если я удаляю "extern "C" и просто сохраните #include «Headers_LAPACKE / …» в блоке № 1 кода.

Сделай это. LAPACK заголовки имеют #if __cplusplus проверки внутри них, они разработаны так, что пользовательский код не нуждается и не должен иметь, extern "C" окружая их.

1

Другие решения

Во-первых, установите компилятор GCC на 4.8 или выше: в моем случае нам пришлось сохранить старый GCC 4.4.7 и одновременно установить GCC 4.9.2. Чтобы иметь возможность использовать более новую версию в компиляции MPI, нужно добавить ее в начало PATH. Для этого смотрите ответ на Как изменить компилятор GCC по умолчанию для использования с MPI в Linux CentOS

Во-вторых, при компиляции с помощью LapackE (оболочки Lapack для C) необходимо использовать следующие параметры препроцессора (-D):

-D LAPACK_COMPLEX_STRUCTURE -D HAVE_LAPACK_CONFIG_H -D ADD_

Пример:

bash-4.1 $ mpiCC main.cpp -L / home / USER1 / lapack-3.6.1 -lapacke -llapack -lblas -lm -Wall -D LAPACK_COMPLEX_STRUCTURE -D HAVE_LAPACK_CONFIG_H -D ADD_

Удостоверься что:

bash-4.1 $ gcc — версия

дает 4,8 или выше. В моем случае это было: GCC (GCC) 4.9.3

1