J'utilise Lapack dans mon code C++. Je suis assez confus comment correctement lier à la bibliothèque. Voici un petit exemple correspondant à mon code appelant une fonction de Lapack:Lien vers la bibliothèque Fortran (Lapack) à partir de C++
#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;
}
Si je tente de le compiler avec GCC 4.8.5 (Linux openSUSE), je reçois l'erreur suivante:
> 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
J'ai compris que c'était un problème de mangling. Si je change mon code en ajoutant un trait de soulignement à la fin du nom de la fonction, il compile correctement avec 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;
}
Mais il ne compile pas avec les compilateurs d'Intel sous Windows. Là, le mangling est différent, je dois le changer en lapack::ILAVER
, puis il compile.
Mon code doit être compilé sous plusieurs configurations (Linux/Mac/Windows) avec plusieurs compilateurs (GCC, Intel, MSVC). Comment puis-je être plus générique et être sûr qu'il sera compilé sous un grand panel de compilateurs?
Utilisez simplement lapacke. Ils ont déjà fait toute la supercherie dégueulasse nécessaire pour que cela fonctionne et c'est l'interface C officielle. –