я использую 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). Как я могу быть более универсальным и быть уверенным, что он будет компилироваться под большой панелью компиляторов?
Как вы уже обнаружили, такие хаки, как добавление подчеркивания, зависят от платформы по своей природе. Поддержка большого количества платформ и компиляторов таким образом «вручную» требует большого количества неприятной и утомительной работы.
Самый простой способ получить переносимость — это использовать 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.
Других решений пока нет …