Ссылка на библиотеку Fortran (Lapack) из переполнения стека

я использую Lapack в моем коде C ++. Я совершенно запутался, как правильно ссылаться на библиотеку. Вот небольшой пример, соответствующий моему коду, вызывающему функцию из Lapack:

#include <iostream>

namespace lapack { extern "C" {
void ilaver(int* major, int* minor, int* patch); } }

int main()
{
int major = 0;
int minor = 0;
int patch = 0;
lapack::ilaver(&major, &minor, &patch);
std::cout << major << "." << minor << "." << patch << std::endl;
return 0;
}

Если я пытаюсь скомпилировать его с помощью GCC 4.8.5 (Linux openSUSE), я получаю следующую ошибку:

> g++ ilaver.cpp -o ilaver -L /softs/lapack/3.7.1/64/gcc/4.8.5/lib64 -l lapack
/tmp/ccHvDCAh.o: In function `main':
ilaver.cpp:(.text+0x33): undefined reference to `ilaver'
collect2: error: ld returned 1 exit status

Я поняла что это название искажения проблема. Если я изменяю свой код, добавляя подчеркивание в конце имени функции, он корректно компилируется с помощью GCC:

#include <iostream>

namespace lapack { extern "C" {
void ilaver_(int* major, int* minor, int* patch); } }

int main()
{
int major = 0;
int minor = 0;
int patch = 0;
lapack::ilaver_(&major, &minor, &patch);
std::cout << major << "." << minor << "." << patch << std::endl;
return 0;
}

Но он не компилируется с компиляторами Intel под Windows. Там калечит иначе, я должен изменить его на lapack::ILAVER, а затем он компилируется.

Мой код должен быть скомпилирован в нескольких конфигурациях (Linux / Mac / Windows) с несколькими компиляторами (GCC, Intel, MSVC). Как я могу быть более универсальным и быть уверенным, что он будет компилироваться под большой панелью компиляторов?

4

Решение

Как вы уже обнаружили, такие хаки, как добавление подчеркивания, зависят от платформы по своей природе. Поддержка большого количества платформ и компиляторов таким образом «вручную» требует большого количества неприятной и утомительной работы.

Самый простой способ получить переносимость — это использовать LAPACKE, официальный интерфейс C для LAPACK. Это также дает дополнительное преимущество, избавляя вас от необходимости повторного объявления всех необходимых вам функций.

Вот простой пример:

#include <iostream>
#include <lapacke.h>

int main()
{
// By using lapack_int, we also support LAPACK-ILP64
lapack_int major = 0;
lapack_int minor = 0;
lapack_int patch = 0;
LAPACKE_ilaver(&major, &minor, &patch);
std::cout << major << "." << minor << "." << patch << std::endl;
return 0;
}

Более подробную информацию можно найти в официальная документация.

Обратите внимание, что LAPACKE обрабатывает только LAPACK, если вам также нужны подпрограммы BLAS, вы можете получить их из CBLAS.

2

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector