cblas_ddot未定義の参照
3089 ワード
#include <iostream>
extern "C" {
#include <cblas.h>
}
using namespace std;
int main(int argc, char const *argv[])
{
double a[6] ={2.5,1.,1.5,1.,1.,1.};
double b[5] ={2.,3.,4.,3.,2.};
double re;
re = cblas_ddot(2, a, 2, b, 2);
cout << "result= " << re << endl;;
return 0;
}
cblasをテストしたいddot関数の時、テストコードを書いて、結果は間違っています:“cblas_ddot」の未定義の参照は、しばらく考えてから分かりました.C/C++がobjファイルにコンパイルされる場合、関数の具体的な実装は必要なく、関数のプロトタイプがあればよいことが知られています.ただし、リンクが実行可能ファイルである場合は、具体的に実装する必要があります.
C++エンジニアリングでは、ライブラリはリンクに使用されます.C++プログラムがオブジェクトファイルにコンパイル.oファイルの場合、次は、リンクです.ライブラリ分静的ライブラリa共有ライブラリと.so(shared objects)は、共有ライブラリを優先的に使用します.ただし、共有ライブラリを使用する場合、ライブラリがシステムのデフォルトパス(/usr/lib/usr/local/lib)にインストールされていない場合は、ライブラリのパスを-Lオプションで指定またはロードパスに追加する必要があります.LIBRARY_PATH、一般的に環境変数LD_の使用を選択LIBRARY_PATH.他にも2つの環境変数があります.INCLUDE_PATHとLIBRARY_PATH. C++プログラムで外部ライブラリが使用されている場合、ソースファイルのみを使用して実行可能ファイルをコンパイルしようとすると、リンク時にコンパイラが「未定義の参照」とエラーを報告します.リンク順の問題に注意してください.gcc/g++コマンドを使用してC++プログラムをコンパイルする場合、コマンドラインのライブラリの順序は、オブジェクトファイル(object files)の同じルールに従います.これらは左から右に検索されます.関数定義を含むライブラリは、その関数を使用するソースファイルとオブジェクトファイルの後ろに表示されます.複数のライブラリを使用する場合、ライブラリ間でも同じルールを遵守する必要があります.定義されていない参照もエラーで報告されます.
gcc命令を使用してコンパイルする場合、g++cblas_のように簡単です.ddot.cpp -lcblas -o cblas_ddot、デフォルトのパスにインストールされていてもlibを表示する必要があります.IDEにおいても、NsightまたはeclipseCDTを例にとると、エンジニアリング属性-->C/C++Build-->Settings-->GCC C++Linker、Librariesを選択し、ライブラリの名前を追加する方法があります.このライブラリはデフォルトパスにインストールされているため、Library search Pathにパスを設定する必要はありません.