Ошибка lnk1169 обнаружен многократно определенный символ один или более

Имею код. Класс, реализация и главная функция. Когда всё находится в одном файле cpp — всё работает. Попытался отделить реализацию класса от интерфейса — получил 2 ошибки.
В чем может быть проблема?

machine.h:

#pragma once
#ifndef MACHINE_H
#define MACHINE_H
class Machine {
public:
    char name[50]; // название станка
    float kol; // количество отработанных часов
    float kolH; // количество изготовленных деталей за час

    void TEST(void);
    void TASK2(const Machine* arr, size_t n);
    void INIT(void);
    void SHOW(void);

    Machine();
    Machine(const char* na, float ko, float koH);
    Machine(const Machine& obj);
    ~Machine();
    };

#endif

machine.cpp:

#include <iostream>
#include <string>
#include <fstream>
#include "machine.h"
using namespace std;
float kool = 0;

Machine::Machine() {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Этот обьект был создан в конструкторе по умолчанию.n";
    strcpy(name, "СтанокВторой");
    kol = 3;
    kolH = 8;
}

Machine::Machine(const char* na, float ko, float koH) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Этот обьект был создан в конструкторе с параметрами.n";
    strcpy(name, na);
    kol = ko;
    kolH = koH;
}

Machine::Machine(const Machine& obj) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Этот обьект был создан в конструкторе копирования.n";
    strcpy(name, obj.name);
    kol = obj.kol;
    kolH = obj.kolH;
}

void Machine::TEST(void) {
    kool += kol;
}

Machine::~Machine() {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Удаление объекта деструктором.n";
}

void Machine::SHOW(void) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Информация о станке:n";
    cout << "nНазвание станка > " << name;
    cout << "nКоличество отработанных часов > " << kol;
    cout << "nКоличество изготовленных деталей за час > " << kolH;
}

void Machine::INIT(void) {
    cout << endl << "--------------------------------------------------" << endl;
    cout << "Введите данные о станке:n";
    cout << "nНазвание > "; cin >> name;
    cout << "nКоличество отработанных часов > "; cin >> kol;
    cout << "nКоличество изготовленных деталей за час > "; cin >> kolH;
}

void Machine::TASK2(const Machine* arr, size_t n) {
    size_t i_min = 0;
    for (size_t i = 1; i < n; ++i)
        if (arr[i_min].kol > arr[i].kol)
            i_min = i;

    std::cout << arr[i_min].name << std::endl;
}

Source.cpp:

#include <iostream>
#include <string>
#include <fstream>
#include "machine.h"
using namespace std;
float kool = 0;

int main() {
    setlocale(0, "");

    Machine M1("Станок_Большой", 32, 68);
    M1.SHOW();
    Machine M2;

    ofstream fout;
    fout.open("1.txt");
    fout << M1.name << " " << M1.kol << " " << M1.kolH;
    fout.close();

    ifstream fin;
    fin.open("1.txt");
    fin >> M2.name >> M2.kol >> M2.kolH;
    fin.close();

    cout << "nИнформация про станок 2:n";
    M2.SHOW();

    fin.open("1.txt");
    fin.seekg(0);
    cout << "nПотоковый вывод содержания 1.txtn";
    char ch;
    while (fin.get(ch))
        cout << ch;
    cout << "nnВывод законченnn";
    fin.close();

    M1.TEST();
    M2.TEST();
    cout << "Количество отработаных часов (общее): " << kool;

    cout << endl << "--------------------------------------------------" << endl;
    cout << "Заполнение массива экземпляров ma";

    Machine ma[2];
    for (int i = 0; i < 2; i++) {
        cout << "nВвод информации про " << i + 1 << " объект";
        ma[i].INIT();
    }
    for (int i = 0; i < 2; i++) {
        cout << "nВывод информации про " << i + 1 << " объект";
        ma[i].SHOW();
    }

    cout << "nnНазвание станка, который имеет наименьшее количество отработанных часов -->> ";
    ma -> TASK2(ma, 2);

    return 0;
}

Ошибки:

1)
Ошибка  LNK2005 "float kool" (?kool@@3MA) уже определен в machine.obj
2)
Oшибка  LNK1169 обнаружен многократно определенный символ - один или более  ПР 6

unreal

0 / 0 / 1

Регистрация: 26.02.2012

Сообщений: 118

1

06.03.2012, 18:36. Показов 59867. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

код который показан снизу я компилировал в двух программах на visual c++ и dev c++
в dev c++ всё прошло успешно но в visual c++ выдаёт ошибку «fatal error LNK1169: обнаружен многократно определенный символ — один или более».. как решить это ?

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 int main()
 {
 int c=7;
 int& d = c; 
 cout <<c;
 system("pause");
 return 0;    
 
 }



0



Эксперт С++

5827 / 3478 / 358

Регистрация: 08.02.2010

Сообщений: 7,448

06.03.2012, 18:45

2

unreal, скорее всего, у тебя в проекте есть еще файл, в котором определена функция main. Выложи сообщение об ошибке полностью



1



unreal

0 / 0 / 1

Регистрация: 26.02.2012

Сообщений: 118

06.03.2012, 20:33

 [ТС]

3

даже так

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 int main()
 {
 int c=7;
 //int& d = c; 
 cout << c << endl;
 system("pause");
 return 0;    
 
 }

пишеть ошибку.
MSVCRTD.lib(crtexew.obj) : error LNK2019: ссылка на неразрешенный внешний символ _WinMain@16 в функции ___tmainCRTStartup
visual studioc++azadDebugazad.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

что делать прошу помогите



0



5230 / 3202 / 362

Регистрация: 12.12.2009

Сообщений: 8,112

Записей в блоге: 2

06.03.2012, 20:50

4

unreal, ты проект ни того типа создал. Создай консольное приложение.



1



0 / 0 / 1

Регистрация: 26.02.2012

Сообщений: 118

06.03.2012, 20:52

 [ТС]

5

спс. а какое их отличие ?



0



5230 / 3202 / 362

Регистрация: 12.12.2009

Сообщений: 8,112

Записей в блоге: 2

06.03.2012, 20:54

6

Разные ключи компиляции для консольного и неконсольного приложения.



1



0 / 0 / 1

Регистрация: 26.02.2012

Сообщений: 118

06.03.2012, 21:04

 [ТС]

7

почему в visual c++ не откроет <iostream.h> ?



0



5230 / 3202 / 362

Регистрация: 12.12.2009

Сообщений: 8,112

Записей в блоге: 2

07.03.2012, 08:09

8

Цитата
Сообщение от unreal
Посмотреть сообщение

почему в visual c++ не откроет <iostream.h> ?

Потому что это старый стандарт, сейчас пишут просто <iostream>



1



-=ЮрА=-

Заблокирован

Автор FAQ

07.03.2012, 16:35

9

Цитата
Сообщение от unreal
Посмотреть сообщение

int& d = c;

Цитата
Сообщение от unreal
Посмотреть сообщение

_WinMain@16 в функции ___tmainCRTStartup
visual studioc++azadDebugazad.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

— это означает что по всей видимости ты выбрал тим проекта Win32 вместо Console aplication. Просто создай по новой проект и выбери правильный тип проекта



1



1 / 1 / 0

Регистрация: 05.11.2012

Сообщений: 8

07.11.2012, 20:13

10

Цитата
Сообщение от Nameless One
Посмотреть сообщение

unreal, скорее всего, у тебя в проекте есть еще файл, в котором определена функция main. Выложи сообщение об ошибке полностью

У меня вообще не выдает ошибку только, если 1 файл в проекте.



0



I am getting this error:

fatal error LNK1169: one or more multiply defined symbols found

Below are two files containing the code. In file 1, I have the main() function and I am calling the functions which are written in the second file named linklist.cpp.
Thanks for helping in advance.

File 1 — main.cpp

#include "stdafx.h"
# include "linklist.cpp"


int main(int argc, _TCHAR* argv[])
{
    node *link_list2;
    link_list2 = createList(31);
    addFront(link_list2,33);
    printList(link_list2);
    printf("Hello There Omer Obaid khann");
    return 0;
}

File 2 — linklist.cpp

# include "stdafx.h"
# include <stdlib.h>
struct node{
    node * next;
    int nodeValue;

};

node* initNode(int number);
node* createList (int value);
void addFront (node *head, int num );
void deleteFront(node*num);
void destroyList(node *list);
int getValue(node *list);

node*createList (int value)  /*Creates a Linked-List*/
{
    node *dummy_node = (node*) malloc(sizeof (node));
    dummy_node->next=NULL;
    dummy_node->nodeValue = value;
    return dummy_node;
}


void addFront (node *head, int num ) /*Adds node to the front of Linked-List*/
{
    node*newNode = initNode(num);   
    newNode->next = NULL;
    head->next=newNode;
    newNode->nodeValue=num;
}

void deleteFront(node*num)   /*Deletes the value of the node from the front*/
{
    node*temp1=num->next;

    if (temp1== NULL) 
    {
        printf("List is EMPTY!!!!");
    }
    else
    {
        num->next=temp1->next;
        free(temp1);
    }

}

void destroyList(node *list)    /*Frees the linked list*/
{
    node*temp;
    while (list->next!= NULL) 
    {
        temp=list;
        list=temp->next;
        free(temp);
    }
    free(list);
}

int getValue(node *list)    /*Returns the value of the list*/
{
    return((list->next)->nodeValue);
}


void printList(node *list)   /*Prints the Linked-List*/
{

    node*currentPosition;
    for (currentPosition=list->next; currentPosition->next!=NULL; currentPosition=currentPosition->next)  
    {
        printf("%d n",currentPosition->nodeValue);
    }   
    printf("%d n",currentPosition->nodeValue);

}

node*initNode(int number) /*Creates a node*/
{
    node*newNode=(node*) malloc(sizeof (node));
    newNode->nodeValue=number;
    newNode->next=NULL;
    return(newNode);
}

Coding Mash's user avatar

Coding Mash

3,3405 gold badges23 silver badges45 bronze badges

asked Oct 4, 2012 at 9:00

OOkhan's user avatar

I stopped reading after # include "linklist.cpp". Don’t include implementation files in other implementation files. (unless you’re doing bulk-builds, which I doubt). Separate declarations in headers and include those, and keep the definitions in the implementation files.

answered Oct 4, 2012 at 9:01

Luchian Grigore's user avatar

Luchian GrigoreLuchian Grigore

253k64 gold badges457 silver badges621 bronze badges

7

You have two ways to solve your problem:

First is given in answer of Luchian Grigore. Create separate header and include it in main file.

Second one is exclude file linklist.cpp from build using project options.
In other way this file will be build twice: during his own build and during main file build.

However, second way is not good programming style. It is better to create header file.

answered Oct 4, 2012 at 9:13

Danil Asotsky's user avatar

Danil AsotskyDanil Asotsky

1,2414 gold badges23 silver badges29 bronze badges

Permalink

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Go to file

  • Go to file

  • Copy path


  • Copy permalink

Cannot retrieve contributors at this time

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Linker Tools Error LNK1169

Linker Tools Error LNK1169

11/04/2016

LNK1169

LNK1169

e079d518-f184-48cd-8b38-969bf137af54

Linker Tools Error LNK1169

one or more multiply defined symbols found

The build failed due to multiple definitions of one or more symbols. This error is preceded by error LNK2005.

The /FORCE or /FORCE:MULTIPLE option overrides this error.

  • Remove From My Forums

 locked

Объясните пожалуйста что не так

  • Вопрос

  • Язык программирования: C

    Среда разработки: Visual Studio 2012 Express

    Не могу понять следующее: я хочу связать между собой main.c и
    count.c(как они выглядят можно найти ниже). 

    В count.c определена переменная num, которая равна
    10. В main.c я хочу вывести переменную
    num
    на экран.

    Если определить num как static int num = 10, то всё работает, однако как только я уберу
    static выходят следующие ошибки: 

    Ошибка
    1 error LNK2005: _b уже определен в count.obj
    c:UsersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29test_29main.obj
    test_29

    Ошибка
    2 error LNK1169: обнаружен многократно определенный символ — один или более
    c:usersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29Debugtest_29.exe
    test_29

    Пожалуйста, объясните в чём ошибка. И да, разве static не должен скрывать переменную от других файлов?

    Код, в котором возникает ошибка:

    main.c:

    #include <stdio.h>
    #include "count.c"
    
    main(void)
    {
    	printf("%dn", num);
    }

    count.c:

    int num = 10;

Ответы

  • #include — это простая текстовая подстановка. То есть у Вас получается:
    main.c:

    #include <stdio.h>
    int num = 10;
    
    main(void)
    {
    	printf("%dn", num);
    }

    count.c:

    int num = 10;

    То есть, оба модуля определяют внешнюю переменную с одним и тем же именем, что и приводит к ошибке.
    При использовании static, оба модуля объявляют свою собственную переменную num, недоступную другому модулю.

    • Помечено в качестве ответа

      11 января 2014 г. 18:37

    • Снята пометка об ответе
      iTiPo
      11 января 2014 г. 19:12
    • Помечено в качестве ответа
      Taras KovalenkoBanned
      12 января 2014 г. 13:45

  • > А разве если мы подставили текст из count.c он не должен далее игнорироваться(файл)?

    Если не ошибаюсь, компилятор пройдётся по всем файлам и скомпилирует весь код, независимо от того, был ли он вставлен уже куда-то.

    Чтобы избежать повторных вставок-комплиляций, используются
    Include guard.

    • Помечено в качестве ответа
      Taras KovalenkoBanned
      12 января 2014 г. 13:45

  • Объект из другого модуля можно использовать, если повторить его объявление с модификатором extern. Вот так может выглядеть модуль main.c:

    #include <stdio.h>
    extern int num; // инициализация не учитывается
    
    void main()
    {
        ...
    }

    Включать директивой include файлы исходного кода нельзя, т.к. это приведет к многократной компиляции их кода.

    • Изменено
      kosuke904
      13 января 2014 г. 5:18
    • Помечено в качестве ответа
      iTiPo
      13 января 2014 г. 7:55

  • Ошибка lnk1168 не удается открыть exe для записи
  • Ошибка lnk1120 неразрешенных внешних элементов 1
  • Ошибка lnk1105 не удается закрыть файл
  • Ошибка lnk1105 visual studio
  • Ошибка lnk1104 не удается открыть файл sfml graphics d lib