1

首先,感谢您在本网站上提供的所有重要信息。它始终是我解决编程问题的第一站。不幸的是,我找不到其他帖子中提到的类似问题的解决方案似乎都不起作用。

我习惯于编写非常大的模拟,但最近遇到了一个我以前没有遇到过的错误。我已将代码减少到几行 - 为了调试,我仍然遇到问题。那是:

当我单击构建(使用 QTcreator 和 C++)时,我收到以下错误:

“:: 错误:randoms.o 和 main.o 中的重复符号 _GENERATOR”

“:: 错误:collect2: ld 返回 1 个退出状态”

阅读其他帖子的表格我知道这往往是#include-ing事情两次的结果,但我没有这样做。

以下是一些产生此错误的代码示例:

代码由 randoms.h、randoms.cpp 和 main.cpp 组成

随机数.h:

#ifndef RANDOMS_H
#define RANDOMS_H

#include <iostream>
#include <iomanip>
#include <ctime>
#include <boost/random.hpp>
#include <stdio.h>
#include <stdlib.h>

const double price = 127.4;

boost::mt19937 GENERATOR(static_cast<unsigned> (std::time(0)));
int randIntRange(int low, int high);
double randDoubleRange(double low, double high);
void d_Range(std::vector<double> *range, double low, double high, double breaks);

#endif // RANDOMS_H

随机数.cpp:

#include"randoms.h"

int randIntRange(int low, int high) {
    boost::uniform_int<> dist(low, high);
    boost::variate_generator<boost::mt19937&, boost::uniform_int<> > range(GENERATOR, dist);
    return range();
}

double randDoubleRange(double low, double high) {
    boost::uniform_real<> dist(low, high);
    boost::variate_generator<boost::mt19937&, boost::uniform_real<> > range(GENERATOR, dist);
    return range();
}

void d_Range(std::vector<double> *range, double low, double high, double breaks) {
    double interval;
    interval = double(high - low)/double(breaks);
    for (double i=low; i < high; i+=interval) {
        range->push_back(i);
    }
}

主.cpp:

#include"randoms.h"

int main() {

    double a = 156;
    double b = 14256;
    std::cout << a << " divided by " << b << " close to " << ((a/b)*randDoubleRange(0.9,1.1)) << std::endl;

    return 0;
}

也许我只是在做一些非常愚蠢的事情,但我不知道为什么会重复任何事情。任何帮助将非常感激。

提前致谢

4

2 回答 2

4

你有这个全局

boost::mt19937 GENERATOR(static_cast<unsigned> (std::time(0)));

在包含在两个文件中的头文件中。也就是说,它被定义了两次。您可能希望将声明放在标题中

extern boost::mt19937 GENERATOR;

以及其中一个 cpp 文件中的定义。就像你对函数所做的那样。

于 2012-01-30T09:57:56.543 回答
0

实际上只是两次定义同一个变量的情况,与boost无关。就像这样:

你好1.cxx

int hello;

主文件

int hello;
int main (){return 1}

请参阅迈克尔的答案以了解如何处理它。

于 2012-01-30T10:04:40.560 回答