2016-12-14 4 views
-1

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

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

При проверке выходных файлов препроцессора на обеих машинах, я могу связать сообщения об ошибках в следующих ситуациях, когда сложные декларации в исходном коде были заменены _Complex. Вот пример объявления сложного динамического ГАМИЛЬТОНИАНА массива, который имеет проблемы при компиляции на Linux:

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

В ОКНАХ PREPROC. ФАЙЛ (работает хорошо): _lapack_complex_double * HAMILTONIAN;

В LINUX PREPROC. FILE (не скомпилируется): double _Complex * HAMILTONIAN;

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

Я пробовал #define Комплекс комплекса, но в конце концов это не помогло.

Некоторые сообщали о проблеме с совместимостью комплекса C99 _Complex и C++: possible similar problem.

Пожалуйста, помогите. Благодаря!

+0

Очевидным ответом является то, что один из этих файлов заголовков, которые включены из '/ home', использует что-то от' 'и' "minMathsForEPM.h" , но не могут явно «включать» самих себя. Таким образом, вы должны сделать это сами. –

+0

@ Сэм Варшавчик: сложная вещь находится в последнем абзаце, если в «рабочем коде» (втором коде) вы добавляете свою программу, то она не работает, и все ошибки связаны с объявлениями сложных величин. Этого не происходит, когда вы компилируете его в Windows. – Boki

+1

Вы все еще не объяснили, что такое «проблема». В великой схеме вещей повторное включение включенных файлов - это тривиальный вопрос, который может быть отправлен через несколько секунд. «Проблема», похоже, уже решена: измените порядок включенных файлов. –

ответ

1

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

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

-D LAPACK_COMPLEX_STRUCTURE -D HAVE_LAPACK_CONFIG_H -D ADD_

Пример:

Баш-4,1 $ mpiCC main.cpp -L/дома/USER1/LAPACK-3.6.1 -llapacke -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

it compiles OK even if I remove "extern "C" and just keep the #include "Headers_LAPACKE/..." in block#1 of the code.

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

+0

@ Ben Voigt: Спасибо за отзыв Бен. Если я удалю ** extern «C» **, я получаю больше ошибок. Дополнительные из них имеют следующий тип: 1) ** error: предыдущее объявление 'float __complex__ lapack_make_complex_float (float, float)' с 'C++' link **. 2) ** ошибка: конфликты с новой декларацией с привязкой «C» ** Это связано со следующей строкой в ​​заголовке LapackE: lapack_complex_float lapack_make_complex_float (float re, float im); – Boki

+0

На этом сайте, https://gcc.gnu.org/ml/libstdc++/2007-02/msg00168.html, сказано, что «В настоящее время C++ не анализирует синтаксис для сложных типов C99, и я знаю, что знаю Сделай так...". Но компиляция работает в Windows. – Boki

+0

@ Ben Voigt: чтобы добавить к моему комментарию выше, дополнительные ошибки связаны с файлами заголовков LapackE. – Boki

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