私のC++コードにLapackを使用しています。私はライブラリに正しくリンクする方法がかなり混乱しています。ここでLAPACKから関数を呼び出して、私のコードに対応した小さな例です。C++のFortranライブラリ(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
名前マングリング問題だと分かりました。
#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;
}
しかし、それはWindowsでIntelのコンパイラでコンパイルしていない:私は、関数名の末尾にアンダースコアを追加し、私のコードを変更した場合、それはGCCと正しくコンパイルされます。そこでは、マングリングが異なっているので、それをlapack::ILAVER
に変更してからコンパイルしなければなりません。
私のコードはいくつかのコンパイラ(GCC、Intel、MSVC)でいくつかの設定(Linux/Mac/Windows)でコンパイルする必要があります。より包括的で、大規模なコンパイラパネルの下でコンパイルする方法を教えてください。
lapackeを使用してください。彼らはすでにこれを動作させるために必要な厄介なマクロトリッキーをやっており、それは公式のCインターフェイスです。 –