Дублированный символ _FOO в a.o и b.o - не обычная причина в C ++ - PullRequest
1 голос
/ 30 января 2012

Прежде всего, спасибо за всю замечательную информацию на этом сайте. Это всегда мой первый порт для проблем с программированием. К сожалению, я не смог найти ни одного из упомянутых в других постах решений о похожих проблемах.

Я привык кодировать очень большие симуляции, но недавно получил ошибку, с которой раньше не сталкивался. Я сократил код до нескольких строк - ради отладки и до сих пор понимаю проблему. То есть:

Когда я нажимаю build (используя QTcreator и C ++), я получаю следующую ошибку:

":: ошибка: дубликат символа _GENERATOR в randoms.o и main.o"

":: error: collect2: ld вернул 1 состояние выхода"

Форма для чтения других постов. Я знаю, что это может быть результатом # включения чего-то дважды, но я этого не делал.

Вот пример кода, который генерирует эту ошибку:

Код состоит из 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;
}

Возможно, я просто делаю что-то действительно глупое, но я не могу понять, почему что-то будет дублироваться. Любая помощь будет высоко ценится.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 30 января 2012

У вас есть этот глобальный

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

в заголовочном файле, который входит в два файла. То есть он определяется дважды. Вы, вероятно, хотите поместить объявление в заголовок

extern boost::mt19937 GENERATOR;

и определение в одном из файлов cpp. так же, как вы делаете с функциями.

0 голосов
/ 30 января 2012

На самом деле это просто случай определения одной и той же переменной дважды и не имеет ничего общего с boost. Это так:

hello1.cxx

int hello;

main.cxx

int hello;
int main (){return 1}

См. Ответ Майкла о том, как с этим справиться.

...