我在我定义的类中使用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;
}
我只想测试这是否编译,所以我创建了一个主要功能,它什么都不做:
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无法弄清楚如何初始化种子......但是在MTR类中有一个默认的种子,所以我看不出问题是什么。
答案 0 :(得分:1)
除了在代码中包含mtrand.h
标头以及正确的文件路径之外,您应该将mtrand.cpp
添加到项目中,以便它与程序的其他.cpp文件一起编译。
如果你使用的库没有提供任何预编译的二进制文件,比如.lib,.dll或.a文件,那么是的,你必须自己编译库的源代码(工作量不大?)为了使链接器满意。但是如果库确实附带了这样的预编译二进制文件,那么你应该告诉链接器它需要链接哪些文件,以便能够找到库头文件中的声明是如何实际实现的,因为链接器不知道否则。实际链接预编译二进制文件的方式取决于您的开发环境。当然,您应该在两种情况下都包含头文件,以告诉编译器MTRand_int32
和其他新标识符的含义。