1

まず第一に、このサイトのすべての素晴らしい情報に感謝します。それは常にプログラミングの問題に対する私の最初の寄港地です。残念ながら、同様の問題について他の投稿で言及されている解決策はどれもうまくいかなかったようです。

私は非常に大規模なシミュレーションのコーディングに慣れていますが、最近、これまでに遭遇したことのないエラーが発生しました。私はコードを数行に減らしました-デバッグのために、そして問題を抱えています。あれは:

(QTcreatorとC ++を使用して)ビルドをクリックすると、次のエラーが発生します。

"::エラー:randoms.oとmain.oでシンボル_GENERATORが重複しています"

"::エラー:collect2:ldが1つの終了ステータスを返しました"

他の投稿を読んでいるフォームこれは#includeの結果である傾向があることを私は知っていますが、私はこれをしていません。

このエラーを生成するコードの例を次に示します。

コードはrandoms.h、randoms.cpp、main.cppで構成されています

randoms.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

randoms.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);
    }
}

main.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)));

2つのファイルに含まれているヘッダーファイル内。つまり、2回定義されます。おそらくヘッダーに宣言を入れたいでしょう

extern boost::mt19937 GENERATOR;

およびcppファイルの1つでの定義。関数の場合と同じように。

于 2012-01-30T09:57:56.543 に答える
0

これは実際には同じ変数を2回定義する場合であり、ブーストとは何の関係もありません。こんな感じです:

hello1.cxx

int hello;

main.cxx

int hello;
int main (){return 1}

対処方法については、マイケルの回答を参照してください。

于 2012-01-30T10:04:40.560 に答える