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)の同じルールに従います.これらは左から右に検索されます.関数定義を含むライブラリは、その関数を使用するソースファイルとオブジェクトファイルの後ろに表示されます.複数のライブラリを使用する場合、ライブラリ間でも同じルールを遵守する必要があります.定義されていない参照もエラーで報告されます.
  • したがって、上記のコードのコンパイル命令は、g++cblas_であるべきである.ddot.cpp -lcblas -o cblas_ddot .result=11を出力します.だからcblas_ddotの最初のパラメータは、a bから選択された要素の個数であるべきであり、すなわち、a bからそれぞれ2ステップ長で2つの要素を内積して選択されるべきである.
  • しかしもう一つの问题があります:どうして同じコードがIDEの中で、例えばeclipseCDTは间违いを报告しますか??一つの問題として、勉強を続けましょう.
    gcc命令を使用してコンパイルする場合、g++cblas_のように簡単です.ddot.cpp -lcblas -o cblas_ddot、デフォルトのパスにインストールされていてもlibを表示する必要があります.IDEにおいても、NsightまたはeclipseCDTを例にとると、エンジニアリング属性-->C/C++Build-->Settings-->GCC C++Linker、Librariesを選択し、ライブラリの名前を追加する方法があります.このライブラリはデフォルトパスにインストールされているため、Library search Pathにパスを設定する必要はありません.