0

定義したクラス内でMTRand ( http://www.bedaux.net/mtrand/の Mersenne Twister 乱数ジェネレーター) を使用しています。コンパイルしようとすると、デコードできない予期しないエラーが発生します。私は初心者の C++ プログラマーです。

私のコードの関連部分は次のとおりです。

#include<iostream>
#include<vector>
#include<deque>
#include<cmath>
#include "./mtrand/mtrand.h"


using namespace std;

class mp{
  long double store;
  deque< vector<long double> > stack;
  long double boundary;
  long double dt;
  long double time;
  MTRand_open random;
  long int random_seed;



public:
  void initialize(long int, long double, long double);
  long double get_state(); // return the state at position int
  void update();
  friend long double A(mp*);
  friend long double D(mp*);
  long double normal();
  vector <long double> viewCurrent(); 


};

次に、呼び出された場合、乱数ジェネレーターのシードを設定する関数があります。

void mp::initialize(long int rand_seed_input, long double bdry_in, long double dt_in){


  time = 0;
  dt = dt_in;

  random_seed = rand_seed_input;

  random.seed(random_seed);

  boundary = bdry_in; 
}

これがコンパイルされるかどうかをテストしたいだけなので、まったく何もしない main 関数を作成します。

int main(){
return 0;
}

コンパイル時にエラーが発生する

Undefined symbols:
  "MTRand_int32::seed(unsigned long)", referenced from:
      mp::initialize(int, long, long double, long double)in ccJylsHh.o
  "MTRand_int32::p", referenced from:
      MTRand_int32::rand_int32()       in ccJylsHh.o
      MTRand_int32::rand_int32()       in ccJylsHh.o
      MTRand_int32::rand_int32()       in ccJylsHh.o
  "MTRand_int32::state", referenced from:
      MTRand_int32::rand_int32()       in ccJylsHh.o
  "MTRand_int32::gen_state()", referenced from:
      MTRand_int32::rand_int32()       in ccJylsHh.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

このエラーが何を意味するのか、どのように削除すればよいのかわかりません。

私が理解していることから、MTRandはシードを初期化する方法を理解できないということです...しかし、クラスMTRand内にデフォルトのシードがあるため、何が問題なのかわかりません。

4

1 に答える 1

1

mtrand.h正しいファイル パスを使用してコードにヘッダーを含めることに加えmtrand.cppて、プロジェクトに追加して、プログラムの他の .cpp ファイルと共にコンパイルされるようにする必要があります。

使用するライブラリが .lib、.dll、または .a ファイルなどのコンパイル済みバイナリを提供しない場合は、そうです。リンカーを幸せにします。しかし、ライブラリがそのようなプリコンパイル済みバイナリを伴う場合は、ライブラリのヘッダー ファイル内の宣言が実際にどのように実装されているかを見つけるために、どのファイルに対してリンクする必要があるかをリンカーに伝える必要があります。 . コンパイル済みバイナリを実際にリンクする方法は、開発環境によって異なります。もちろん、どちらの場合もヘッダー ファイルをインクルードして、コンパイラに何を意味しMTRand_int32、他の新しい識別子が何を意味するかを伝える必要があります。

于 2012-07-22T20:20:17.883 に答える