2012-07-22 65 views
0

我在我定义的类中使用MTRand(来自http://www.bedaux.net/mtrand/的Mersenne Twister随机数发生器)。当我尝试编译时,我得到一个我无法解码的意外错误。我是一个新手的C++程序员,所以任何帮助将很长的路要走......MTRand在汇编时产生错误

这里是我的代码的相关部分:

#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

你链接了图书馆吗? – Mysticial 2012-07-22 20:13:45

+0

我不确定链接库的含义。 对于编译,我只需键入'g ++ nameOfFile.cpp'并获取发布的错误。 我也尝试用'/ Users/path/to/mtrand/mtrand.h'类型的绝对路径替换mtrand的相对路径名,并使用'g ++ nameOfFile.cpp'重新编译,而且我仍然得到相同的错误。 我尝试编译与mtrand一起提供的测试代码,并得到完全相同的错误,但我无法在我的目录中的文件夹中找到任何.o文件。我非常困惑! – 2012-07-22 20:29:55

回答

1

除了在您的代码中包含mtrand.h头文件以及正确的文件路径之外,您应该将mtrand.cpp添加到您的项目中,以便它与您的程序的其他.cpp文件一起编译。

如果您使用的库不提供任何预编译的二进制文件,如.lib,.dll或.a文件,那么您必须自己编译该库的源代码(没有太多的工作权利? )为了使链接器感到高兴。但是,如果库确实伴随着这种预编译的二进制文件,那么您应该告诉链接器需要链接哪些文件,以便能够找到库的头文件中的声明是如何实际执行的,因为链接器没有其他的想法。如何实际链接预编译的二进制文件取决于您的开发环境。当然,你应该在两种情况下都包含头文件来告诉编译器MTRand_int32和其他新标识符是什么意思。

+0

是的,这使得它编译没有错误。这是通常完成的吗?要包含头文件和伴随头文件的.cpp文件? – 2012-07-22 20:32:06

+0

@ user1544430更新了答案。 – 2012-07-22 20:50:32

+0

谢谢!现在对我来说这很有意义。 – 2012-07-22 20:53:31