Ошибка lnk2005 main уже определен в source obj

Rishats

1 / 1 / 2

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

Сообщений: 55

1

13.09.2014, 15:46. Показов 50237. Ответов 6

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


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

Добрый день уважаемые.
Столкнулся с данной проблемой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL , "Russian");
    
    char a('F'); // 1 байт
 
    cout << "a = '" << a << "'n";
    cout << "a = "  << (int)a << endl;
 
    _getch();
    return 0;
    
}
HTML5
1
2
3
4
5
6
7
8
9
1>------ Построение начато: проект: 4, Конфигурация: Debug Win32 ------
1>Компиляция...
1>5.cpp
1>Компоновка...
1>5.obj : error LNK2005: _main уже определен в int.obj
1>C:UsersAnonymousDocumentsVisual Studio 2008Projects4Debug4.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>Журнал построения был сохранен в "file://c:UsersAnonymousDocumentsVisual Studio 2008Projects44DebugBuildLog.htm"
1>4 - ошибок 2, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

P.S
Компилятор Visual C++ 2008

Работаю по данному уроку: https://www.youtube.com/watch?… 2WD1MLA9DA
Может где-то проворонил что ? Уже 20 минуту ищу , не могу найти , грешу уже на компилятор.
Заметил что , если имеется 2 элемент в проекте . Данная проблема появляется .



0



1180 / 893 / 94

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

Сообщений: 2,461

13.09.2014, 15:49

2

Что за int.obj? Есть ли в проекте файл int.cpp? Если да, то его нужно удалить или исключить из построения. Нельзя определять функцию больше одного раза ( в данном случае компоновщик говорит, что функция main уже определена в int.obj ).



0



1 / 1 / 2

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

Сообщений: 55

13.09.2014, 16:05

 [ТС]

3

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

Что за int.obj? Есть ли в проекте файл int.cpp? Если да, то его нужно удалить или исключить из построения. Нельзя определять функцию больше одного раза ( в данном случае компоновщик говорит, что функция main уже определена в int.obj ).

Вообщем , если создать 1 элемент и произвести компиляцию , ошибок не будет , если создать в проекте еще 1 элемент , прошу заметить с любым названием , проблема вновь приходит , прилажу скрин.

Добавлено через 16 секунд

Добавлено через 26 секунд



0



1180 / 893 / 94

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

Сообщений: 2,461

13.09.2014, 16:09

4

Лучший ответ Сообщение было отмечено Rishats как решение

Решение

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



2



1 / 1 / 2

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

Сообщений: 55

13.09.2014, 16:12

 [ТС]

5

Вот я чайник , спасибо , все ясно!

Добавлено через 3 минуты

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

В проекте не должно быть 2 функции main

Спасибо )



0



1 / 1 / 0

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

Сообщений: 5

04.04.2015, 15:30

6

ну я сделал вот так)

#include <iostream>
using namespace std;

int main2()
{
setlocale(0, «»);
double_t num;
int k;

cout << «Введите произвольное число: «;
cin >> num;
пишешь «main2» и все пошло!!!



1



0 / 0 / 0

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

Сообщений: 1

09.02.2022, 17:35

7

Спасибо



0



Background

I have a project named PersonLibrary which has two files.

  1. Person.h
  2. Person.cpp

This library produces a static library file. Another project is TestProject which uses the PersonLibrary (Added though project dependencies in VS008). Everything worked fine until I added a non-member function to Person.h. Person.h looks like

class Person
{
public:
    void SetName(const std::string name);

private:
    std::string personName_;
};

void SetPersonName(Person& person,const std::string name)
{
    person.SetName(name);
}

Person.cpp defines SetName function. When I try to use SetPersonName from TestProject, I get error LNK2005: already defined. Here is how I used it

#include "../PersonLibrary/Person.h"
int main(int argc, char* argv[])
{
    Person person;
    SetPersonName(person, "Bill");
    return 0;
}

Workarounds tried

1 — I have removed the Person.cpp and defined the whole class in Person.h. Error gone and everything worked.

2 — Changed the SetPersonName modifier to static. Like the below

static void SetPersonName(Person& person,const std::string name)
{
    person.SetName(name);
}

Questions

  1. Why the code shown first is not working as I expected?
  2. What difference static made here?
  3. What is the approapriate solution for this problem?

Thanks

asked Mar 7, 2009 at 18:05

Navaneeth K N's user avatar

Navaneeth K NNavaneeth K N

15.3k37 gold badges126 silver badges184 bronze badges

You either have to

  • move SetPersonName‘s definition to a .cpp file, compile and link to the resulting target
  • make SetPersonName inline

This is a well known case of One Definition Rule violation.

The static keyword makes the function’s linkage internal i.e. only available to the translation unit it is included in. This however is hiding the real problem. I’d suggest move the definition of the function to its own implementation file but keep the declaration in the header.

demented hedgehog's user avatar

answered Mar 7, 2009 at 18:11

dirkgently's user avatar

dirkgentlydirkgently

107k16 gold badges131 silver badges187 bronze badges

4

When you compile you’re library, its lib file contains a definition for SetPersonName. When you compile your program that uses the library, since it includes the header, and you’ve written the code inline in the header it also compiles in a definition for SetPersonName. Two definitions for the same function aren’t (generally) allowed. The static keyword tells the compiler that the function shouldn’t be exposed outside of the current translation unit (discrete piece of code you are compiling), so the definition in the library isn’t visible to the linker.

The appropriate solution to this problem depends on your goals. Header files with static function declarations is almost never what you want. From a design standpoint I would recommend getting rid of SetPersonName altogether, and just use Person::SetName.

However, failing that, I would implement it much like you’ve done for the rest of your functionality, declarations in the header, and implementation in the .cpp. Inline functions associated with a library will tend to diminish many of the advantages of using a library in the first place.

answered Mar 7, 2009 at 18:22

Logan Capaldo's user avatar

Logan CapaldoLogan Capaldo

39.4k5 gold badges63 silver badges78 bronze badges

By declaring the function static you are scoping it to the current translation unit, so in effect you have added a new SetPersonName function in your main file, and would be calling that not the one defined in the library.

The correct solution is to declare SetPersonName as extern in person.h and implement it in person.cpp

Person.h

extern void SetPersonName(Person& person,const std::string name);

Person.cpp

void SetPersonName(Person& person,const std::string name)
{
    person.SetName(name);
}

answered Mar 7, 2009 at 18:12

Rob Walker's user avatar

Rob WalkerRob Walker

46.4k15 gold badges98 silver badges136 bronze badges

  1. The function SetPersonName will be compiled into each objectfile that includes the Person.h file, thus making the linker seeing several functions and giving the error.

  2. By writing static you state that the function will only be visible within a single objectfile. You will still get several functions in you binary but now you will not get the errors.

  3. Try to write inline before the function like

    inline void SetPersonName(Person& person,const std::string name)
    {
        person.SetName(name);
    }
    

    …because the function is pretty simple it is OK I think to have it as an inline. An inline will place the necessary code where the function is used, without actually creating a function to be called.

answered Mar 7, 2009 at 18:09

epatel's user avatar

A solution would be to make that function a static method. That will stop the «already defined» errors.

answered Mar 7, 2009 at 18:18

Geo's user avatar

GeoGeo

92.8k117 gold badges342 silver badges519 bronze badges

I had a similar situation as described clearly by @logan-capaldo above.

A CPP source file (myfile.cpp) contained a function MyFunction. When building, this got compiled into myfile.obj. But the main CPP file (main.cpp) also included myfile.cpp, so the function MyFunction was being included/compiled/linked twice, leading to the «LNK2005 already defined» error.

This is messy but I didn’t have time to fix it properly. The quickest fix (in VS Express 2012) was to right-click myfile.cpp in Solution Explorer, go to Properties and change Excluded From Build to Yes. I guess this prevents one of the OBJ files from being created and/or linked and so removes the error.

answered Jan 27, 2016 at 16:22

Paul's user avatar

PaulPaul

6698 silver badges9 bronze badges

For anyone landing here dealing with this error in a Qt project, make sure you don’t have any non-signal functions defined under signals: in your header files.

Incorrect, throws LNK2005 on Foo::promiseData():

class Foo : public QObject {
        Q_OBJECT

    public:
        explicit Foo(QObject* parent = nullptr);

    signals:
        void dataReady(QList<QObject*> data) const;

        void promiseData() const; // <-- This function is not supposed to be a signal.

Correct:

class Foo : public QObject {
        Q_OBJECT

    public:
        explicit Foo(QObject* parent = nullptr);

        void promiseData() const;

    signals:
        void dataReady(QList<QObject*> data) const;

answered Sep 13, 2019 at 21:18

Clifton Roberts's user avatar

There are many question about this error. But they are related to only a single variable.

test.h

namespace World
{
    enum Objects
    {
        TERRAIN = 1,
        BOX = 2,
        SPHERE = 4,
        CAPSULE = 8

    };  

    void WorldObjects2(unsigned int mask)
    {
      .......
    }
}

void test();

test.cpp

#include "test.h"

void test()
{
    .......
}

main.cpp

#include "test.h"
int main()
{
    test();
    return 0;
}

When I run these code on visual stduio 2013, it throws an error. It says that error LNK2005: "void __cdecl World::WorldObjects2(unsigned int)" (?WorldObjects2@World@@YAXI@Z) already defined in main.obj. How can I correct this error?

Vlad from Moscow's user avatar

asked May 28, 2015 at 9:03

zakjma's user avatar

1

Your project has two definitions of function WorldObjects2 : one is in the compilation unit test.cpp and other is in the compilation unit main.cpp because the header where the function is defined is included in these two cpp files.

Either use function specifier inline

inline void WorldObjects2(unsigned int mask)
{
    .......
}

Or move the function definition to some cpp file leaving only a function declaration (without its definition) in the header.

Another approach is to make the function as having the internal linkage. For example you could add keyword static

static void WorldObjects2(unsigned int mask)
{
    .......
}

or could place the function in an unnamed namespace within the given namespace.

namespace World
{
    // ...
    namespace
    {
        void WorldObjects2(unsigned int mask)
        {
            .......
        }
    }  
}

Timo's user avatar

Timo

2,2121 gold badge25 silver badges46 bronze badges

answered May 28, 2015 at 9:07

Vlad from Moscow's user avatar

Vlad from MoscowVlad from Moscow

297k24 gold badges184 silver badges332 bronze badges

6

На чтение 4 мин. Просмотров 257 Опубликовано 15.12.2019

Следующая структура кода:

Содержание

  1. ArrayStack.h
  2. ArrayStack.cpp
  3. Array.h
  4. Array.cpp
  5. main.cpp
  6. 1 ответ
  7. 1 ответ 1
  8. Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ методы компоновщик или задайте свой вопрос.
  9. Похожие
  10. 2 ответа

ArrayStack.h

ArrayStack.cpp

Array.h

Array.cpp

main.cpp

генерирует эти ошибки:

LNK1169 найдено один или несколько найденных символов с несколькими значениями

LNK2005 _main уже определен в Array.obj

В чем проблема? Обратите внимание, что Array.cpp имел int main() , определенный сам по себе, когда он был впервые включен в проект, но больше не имеет его (ни ArrayStack.cpp ). Кроме того, код компилируется просто отлично, когда int main() в main.cpp опущен.

c++ visual-studio linker-errors

1 ответ

2 Решение TobiMcNamobi [2015-12-04 11:28:00]

Сообщение об ошибке означает, что во всех скомпилированных кодах, *.obj файлах, компоновщик находит более одной функции main() . Очевидно, что один из них находится в main.cpp.

Первое решение, которое приходит на ум, как упоминалось в комментариях, состоит в том, чтобы (принудительно) перекомпилировать, как-то удаляя файлы *.obj.

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

Собственно сам код:
head.h

head.cpp

main.cpp

1 ответ 1

Включайте через #include заголовочный файл с объявлениями, но не с определениями. Так, как сделали вы, у вас масса определенных (не объявленных, а именно определенных) функций оказывается скомпилированной как в файле head.obj , так и в main.obj , и компоновщик не знает, какой из вариантов выбрать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ методы компоновщик или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459

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

Я должен предоставить вам, что у меня есть, так как я сделал это в Visual Studio (создан пустой/пустой проект, так что не было ни одного файла «stdafx.h» Должен ли он быть там.?):

И это то, что я до сих пор для main.cpp. Это не полный на данный момент, но я просто хочу убедиться, что я на правильном пути:

Так что я до сих пор должны printMonthlySales для storeMonhtlySales за месяц 1 (январь). «Натянуть» и «CIN >> А» были только там, чтобы предотвратить окно терминала от закрытия автоматически (опять же, я делаю это в Visual Studio).

Тем не менее, я компиляция этих и я получаю две ошибки:

Я озадачен, почему они говорят, что printMonthlySales является «уже определен», так как я не вижу ничего плохого здесь. Просматривая файлы Sales.obj и main.obj ничего не сделал.

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Когда вы включаете файл, он эффективно копировать и вставлять в том числе файл. Все в заголовке теперь часть из файла компилируется. #pragma once , и другие формы включают защитные ограждения предотвратить файл от включения более чем один раз в единица перевода.

единицы перевода составляются отдельно, так что нет никакой преемственности между ними. Там нет никакого способа для B.cpp знать, что a.cpp уже включил данный заголовок. На самом деле, думать о том, как все плохо было бы, если только один файл в большом проекте может #include . C++ был бы отброшен, как пустая трата времени, прежде чем он даже вышел из офиса и в коридоре в Bell Labs.

Так. a.cpp и B.cpp оба включают header.h. Они оба имеют свою собственную копию всего в header.h. Оба скомпилирован просто отлично, но компоновщик не имеет представления о том, что делать с конкурирующими определениями.

extern это обещание, что где-то storeMonthlySales будет определяться так, что компилятор может продолжать делать свою работу. Если он не определен, компоновщик будет жаловаться.

это определение. Он существует только в Sales.cpp. Он может использоваться любой файл, который включает в себя Sales.h

Кстати, следить за using namespace std; . Это заставит вас проблему.

  • 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

Понравилась статья? Поделить с друзьями:
  • Ошибка lnk2005 main уже определен в consoleapplication1 obj
  • Ошибка lnk2001 неразрешенный внешний символ static
  • Ошибка lnk2001 неразрешенный внешний символ main
  • Ошибка lnk2001 unresolved external symbol
  • Ошибка lnk1169 обнаружен многократно определенный символ один или более