WedX - журнал о программировании и компьютерных науках

обнаружена ошибка при компиляции одного или нескольких многократно определенных символов

При сборке я сталкиваюсь с этими ошибками:

Ошибка 5, ошибка LNK2005: "int __cdecl numGen(void)" (?numGen@@YAHXZ), уже определенная в main.obj Ошибка 6, ошибка LNK1169: найден один или несколько многократно определенных символов

numGen.cc:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

основной.cc:

#include <iostream>
#include "NumGen.cc"

int main()
{
    std::cout << numGen();
    return 0;
}
c++
04.12.2012

  • Почему вы #включаете исходный файл? 04.12.2012
  • @GManNickG Вот где функция ... 04.12.2012
  • Какой файл команды/сделать вы используете для компиляции? Можете ли вы опубликовать заголовок 04.12.2012

Ответы:


1

#includeДобавляя NumGen.cc в файл main.cc, вы заставляете препроцессор создавать два файла, подобные следующим:

NumGen.cc:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

и main.cc:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

int main()
{
    std::cout << numGen();
    return 0;
}

потому что директива препроцессора #include просто вставляет содержимое файла, который вы включаете, туда, куда вы его включаете (если, конечно, он не был включен ранее и не заключен в защиту включения. Я также предполагаю, что вы компилируете как NumGen.cc, так и main.cc на одну и ту же командную строку, поэтому, естественно, вы получите ошибку множественного определения символа, учитывая, что функция numGen теперь определена и реализована в обоих файлах.

Что вам нужно сделать, так это объявить numGen в заголовочном файле, назовем его NumGen.h:

int numGen();

а затем поместите строку #include "NumGen.h" как в NumGen.cc, так и в main.cc.

04.12.2012

2

Не следует включать файлы C++ в другие файлы C++. Это приводит к двойному определению символов. Вместо этого вы должны создать заголовочный файл с предварительным объявлением, включить его в оба файла, разделяющих функцию, и скомпилировать файлы отдельно:

numGen.h:

int numGen();

Включите numGen.h в оба файла cc и удалите #include "NumGen.cc".

04.12.2012

3

Вы включаете файл cc. Включайте только фактический заголовок

04.12.2012
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]