Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/59: Рейтинг темы: голосов - 59, средняя оценка - 4.66
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
1

Ошибки линковки LNK2005, LNK1169

04.04.2012, 18:19. Показов 11611. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как-то пробовал сделать программу из нескольких модулей, но наткнувшись на какие-то непонятные ошибки забросил это дело...
Решив же намедни окончательно разобраться с этим вопросом, я опять столкнулся с непонятными ошибками линковки, поиск чётких ответов не дал.
Что же тут не так?

Файл Example.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef EXAMPLE_CPP
#define EXAMPLE_CPP
 
#include <string>
#include <iostream>
 
int out_string1(std::string str)
{
    std::cout << str << 1 << std::endl;
    return true; 
}
 
using namespace std;
void out_string2(string str)
{
    cout << str << 2 << endl;
}
 
#endif
Главный файл с мейном:

C++
1
2
3
4
5
6
7
8
9
#include "Example.cpp"
 
 
void main()
{
    out_string1("ololo");
    out_string2("test");
    system("pause");
}
1>ManifestResourceCompile:
1> All outputs are up-to-date.
1>Test.obj : error LNK2005: "int __cdecl out_string1(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?out_string1@@YAHV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ @Z) уже определен в Example.obj
1>Test.obj : error LNK2005: "void __cdecl out_string2(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?out_string2@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ @Z) уже определен в Example.obj
1>C:\Users\User_name\Desktop\Test\Debug\Test.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
Среда VS 10.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2012, 18:19
Ответы с готовыми решениями:

Как исправить ошибки LNK2005 и LNK1169 ?
Добрый день! Написала программу, а мне выдаёт ошибки, а именно: LNK2005 и LNK1169 . Подскажите...

LNK2005+LNK1169
Ошибки: Error LNK2005 &quot;char const * * botNames&quot; (?botNames@@3PAPEBDA) already defined in...

LNK2005 и LNK1169. Не знаю, как исправить
Есть несколько файлов, жалуется на LNK2005 и LNK1169, не знаю, как исправить #pragma once...

Ошибка линковки файлов при компиляции: "fatal error LNK1169: обнаружен многократно определенный символ"
Visual C++ 2008 Express Edition ошибка Компиляция... 1.cpp Компоновка... 2.obj : error...

20
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 18:24 2
#include "Example.cpp"
Никогда так не делай.
Инклудятся только заголовочные (header) файлы
#ifndef EXAMPLE_CPP
#define EXAMPLE_CPP
Это вообще смешно
Хочешь где-нибудь зачем-нибудь написать стражи включения, создай
Example.h
и в него пихай
Линкер сам найдёт твой экзампл.спп и свяжет с майном
Нужно только указать для компилятора объявления функций
C++
1
2
3
4
5
6
7
8
9
void out_string1(std::string);//эти два объявления обязательны, но 
void out_string2(std::string);//приличные люди пихают их в новый файл Example.h ивместо них здесь 
////////////////////////////////тогда будет #include "Example.h"
void main()
{
    out_string1("ololo");
    out_string2("test");
    system("pause");
}
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.04.2012, 18:41  [ТС] 3
Не помогло...
Насколько я помню расширение подключаемых файлов может быть хоть txt, тк препроцессор работает с текстовыми файлами, а какое им задать расширение это дело традиции...

Добавлено через 10 минут
Можно пример правильно оформленных файлов для успешной компиляции?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 18:52 4
Пример ща напишу, а по поводу инклуда спп
Пойми подключать в одно целое cpp файлы это работа линкера и ты ему мешаешь её выполнять
Хочешь подключить тхт? Вот и переименуй example.cpp в example.txt, извращенец
А линкер их сам соберёт, слышал понятие "раздельная компиляция"?
ща пример будет

Добавлено через 4 минуты
Файл Example.h
C++
1
2
3
#include <string>
int out_string1(std::string );
int out_string2(std::string );
Файл Example.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Example.h"
#include <iostream>
 
int out_string1(std::string str)
{
    std::cout << str << 1 << std::endl;
    return true; 
}
 
using namespace std;
void out_string2(string str)
{
    cout << str << 2 << endl;
}
Главный файл с мейном:

C++
1
2
3
4
5
6
7
#include "Example.h"
void main()
{
    out_string1("ololo");
    out_string2("test");
    system("pause");
}
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.04.2012, 18:54 5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Линкер сам найдёт твой экзампл.спп и свяжет с майном
Линкер не умеет сам находить файлы, которые надо связать. Для этого существуют мэйкфайлы, конфигурации проектов и другие приблуды.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А линкер их сам соберёт, слышал понятие "раздельная компиляция"?
Вот именно. Вы слышали?
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Файл Example.h
Инклуд гуарды для слабаков?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 18:58 6
Цитата Сообщение от fasked Посмотреть сообщение
Инклуд гуарды для слабаков?
Мне впадлу было.

Цитата Сообщение от fasked Посмотреть сообщение
Линкер не умеет сам находить файлы, которые надо связать. Для этого существуют мэйкфайлы, конфигурации проектов и другие приблуды.
Ясно. Теперь Скажи, зачем мэйкфайлы человеку пытающемуся создать первый проект из двух файлов спп в MSVS? Инклуд стражи он уже использовал не там где надо.
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.04.2012, 19:03  [ТС] 7
Kuzia domovenok, работает, сейчас буду разбираться как)

fasked, пожалуйста, если можете дополнить, я буду весьма благодарен.

Новые вопросы:
Что за инклуд гуарды?
Как же надо использовать "инклуд стражи"?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.04.2012, 19:30 8
Лучший ответ Сообщение было отмечено как решение

Решение

Whiteha, include guard это те самые
C
1
2
3
4
#ifndef FILENAME_H
#define FILENAME_H
 
#endif
Защищают от множественного включения одного файла. Если, например, сделать
C
1
2
#include "something1.h"
#include "something2.h"
И в этих хэдэрах подключается один и тот же заголовочныый файл, в котором не стоят инклуд гуарды, то собрать проект не выйдет.
Так что лучше их использовать всегда.

Директива #include просто подставляет содержимое файла. Так что сами представьте, что будет, если подставить содержимое одного файла дважды. Уж точно ничего хорошего
Цитата Сообщение от Whiteha Посмотреть сообщение
Насколько я помню расширение подключаемых файлов может быть хоть txt, тк препроцессор работает с текстовыми файлами, а какое им задать расширение это дело традиции
Совершенно верно. Однако, следует помнить, что иные способы могут вызвать кучу недоразумений и непониманий. Собственно отсюда и пошли традиции - чтобы все друг друга понимали.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Скажи, зачем мэйкфайлы человеку пытающемуся создать первый проект из двух файлов спп в MSVS? Инклуд стражи он уже использовал не там где надо.
То, что MSVS сама генерирует мэйкфайл или что-либо подобное не значит, что его нет или что этого человека можно обманывать, говоря о линкере как о всеумеющей тулзе. Это не так.

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Мне впадлу было.
Я так посмотрю с Вами часто такое.

3
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 19:45 9
Человек спросил, как "собрать проект из двух файлов в MSVS"
Конкретный вопрос. Всё. Я ему вообще не хотел сначала писать весь этот код, говорить, что объявления функций нужно выносить в заголовочные файлы, и.т.д.и.т.п. Посмотри мой первый пост. Там даже про .h файл не упомянуто.
Он не спрашивал про инклудгарды, мейк файлы, компиляцию и линковку из командной строки и прочие извращения. Даны функции, сказано построить в MSVS - я ответил. Лишняя информация только отвлекает.
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
04.04.2012, 19:52 10
Цитата Сообщение от fasked Посмотреть сообщение
И в этих хэдэрах подключается один и тот же заголовочныый файл, в котором не стоят инклуд гуарды, то собрать проект не выйдет.
то есть если в одном файле я определю код между
C++
1
2
3
4
#ifndef FILENAME_H
#define FILENAME_H
 
#endif
то во втором он уже не будет определяться,так как уже определён?
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.04.2012, 19:54  [ТС] 11
Сейчас имеется:

Интерфейс Example.h:
C++
1
2
3
4
5
6
#include <string>
#include <iostream>
 
using namespace std;
int  out_string1(string );
void out_string2(string );
Реализация Example.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "Example.h"
 
int out_string1(string str)
{
    cout << str << 1 << endl;
    return true; 
}
 
void out_string2(string str)
{
    cout << str << 2 << endl;
}

Файл с мейном:
C++
1
2
3
4
5
6
7
8
#include "Example.h"
 
void main()
{
    out_string1("ololo");
    out_string2("test");
    system("pause");
}
Файл с мейном включает в себя Example.h, using nemespace std из которого распространяется на всю остальную программу, однако по поводу Example.h и Example.cpp есть некоторые вопросы:
1) Как Example.h подключает Example.cpp?
И почему это работает, если Example.cpp вновь подключает Example.h(почему не получается бесконечная рекурсия и VS не посылает нас разбираться с ошибками)?
2) Почему при попытке вынести из Example.h
C++
1
2
#include <string>
#include <iostream>
в файл с мейном перед #include "Example.h" на нас обрушивается лес ошибок?
3) Как при данной организации файлов правильно организовать инклуд гуарды?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 20:01 12
Цитата Сообщение от alexey31415 Посмотреть сообщение
то есть если в одном файле я определю код между
C++
1
2
3
4
#ifndef FILENAME_H
#define FILENAME_H
 
#endif
то во втором он уже не будет определяться,так как уже определён?
Товарищ говорил о случаях, когда ты в один cpp прямо или косвенно подключаешь два одинаковых h файла так
C++
1
2
#include "head.h"
#include "head.h"
или так косвенно
C++
1
2
3
4
5
//main.cpp
#include "head2.h"
#include "head.h"
............
//////////////////////////
C++
1
2
3
//head2.h
#include "head.h"
..................
Но не парься, главное не пиши их больше в спп файлах. Если знаешь, что такое #ifndef - поймёшь как они работают.
Вообще, я пишу их, когда линковщик выдаёт очередную страшную LNK ошибку.
У тебя ж всего два файла! Как в них запутаешься?
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.04.2012, 20:10  [ТС] 13
Ок, значит если ставить защиту от множественного подключения, то тока в *.h, так:
Example.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef EXAMPLE_H
#define EXAMPLE_H
 
#include <string>
#include <iostream>
 
using namespace std;
int  out_string1(string );
void out_string2(string );
 
#endif
Так?

А как быть с 1 и 2 жизненными вопросами(Ошибки линковки LNK2005, LNK1169)?=\
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.04.2012, 20:13 14
Цитата Сообщение от Whiteha Посмотреть сообщение
Сейчас имеется:

Интерфейс Example.h:
C++
1
2
3
4
5
6
7
8
9
#ifndef EXAMPLE_@ADEcx
#define EXAMPLE_@ADEcx
#include <string>
#include <iostream>
 
using namespace std;
int  out_string1(string );
void out_string2(string );
#endif
Реализация Example.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "Example.h"
 
int out_string1(string str)
{
    cout << str << 1 << endl;
    return true; 
}
 
void out_string2(string str)
{
    cout << str << 2 << endl;
}

Файл с мейном:
C++
1
2
3
4
5
6
7
8
#include "Example.h"
 
void main()
{
    out_string1("ololo");
    out_string2("test");
    system("pause");
}
1) Как Example.h подключает Example.cpp?
И почему это работает, если Example.cpp вновь подключает Example.h(почему не получается бесконечная рекурсия и VS не посылает нас разбираться с ошибками)?
2) Почему при попытке вынести из Example.h
C++
1
2
#include <string>
#include <iostream>
в файл с мейном перед #include "Example.h" на нас обрушивается лес ошибок?
3) Как при данной организации файлов правильно организовать инклуд гуарды?
CPP никуда друг к другу не подключаются и не должны подключаться. Они компилируются как есть в промежуточные объектные файлы. абсолютно независимо друг от друга. Все указания "вызвана внешняя функция из другого куска программы" и связывание этих кусков в единый экзешник происходят потом.
В том то и фокус, что прописывая вызов функции, тебе для успешной компиляции достаточно иметь лишь её объявление

int out_string1(string );

Вот такие объявления действительно напрямую пришиваются инклудами в спп файл,
Т.е. достаточно знать, что такая функция есть, и какой у неё синтаксис при использовании.
На место вызова ф-ии компилятор поставит переход, а адрес перехода потом определится
А уже после компиляции проект соберётся в одно целое и
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
05.04.2012, 12:55 15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вообще, я пишу их, когда линковщик выдаёт очередную страшную LNK ошибку
В краевом случае, когда все файлы содержат включение всех остальных, стражи включения придётся написать везде. Так почему бы их не писать сразу?
0
fasked
05.04.2012, 13:14
  #16

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Так почему бы их не писать сразу?
[irony]В простой программе нафига это надо, если и так все видно и понятно, легко контролируется. Лень же.[/irony]

2
kazak
05.04.2012, 13:28
  #17

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Лень же
Так оно может перерасти в привычку:)

0
silent_1991
05.04.2012, 13:46
  #18

Не по теме:

kazak, так это уже не к faskedу :D

0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.04.2012, 23:07  [ТС] 19
Стал пробовать с классами, вновь выскочили две ошибки, на этот раз LNK2001 и LNK1120, как сделать правильно?

Example.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
 
#include <string>
#include <iostream>
 
template <class T> class arr
{
    T* v;
    unsigned size;
public:
    arr(unsigned i);
    T &operator[](unsigned i);
    arr &operator=(arr &obj);
    ~arr();
};
Example.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma once
 
#include "Example.h" 
 
template <class T>
arr<T>::arr(unsigned i)
{
    v = new T[i];
    size = i;
}
 
template <class T>
arr<T>::~arr()
{
    delete[] v;
}
 
template <class T>
T &arr<T>::operator[](unsigned i)
{
    if (i < size) return v[i];
    else throw 42;
}
 
template <class T>
arr<T> &arr<T>::operator=(arr &obj)
{
    if (this->v == obj.v) return *this;
    delete[] v;
    size = obj.size;
    v = new T[size];
    for(unsigned i = 0; i < obj.size; ++i) v[i] = obj.v[i];
}
Файл с main'ом:
C++
1
2
3
4
5
6
7
#include "Example.h"
 
void main()
{
    arr<int> obj(10);
    system("pause");
}
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
05.04.2012, 23:38 20
Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:


[irony]В простой программе нафига это надо, если и так все видно и понятно, легко контролируется. Лень же.[/irony]

В простой программе нафига это надо, если и так все видно и понятно, легко контролируется. Лень же.

Более того, в первом посте, я советовал вообще вместо h файла написать ВСЕГО 2 строчки объявлений 2х функций.
Но нет, давайте, посоветуйте создать, как лучшие гуру программирования советуют.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef EXAMPLE_@ADEcx
#define EXAMPLE_@ADEcx
#include <string>
class Example_output_manager:public Example, public output, public manager{
private:
string secret_data;
void safe_out_string(string);
public:
explict Example_output_manager(string);
Example_output_manager(const Example_output_manager&);
Example_output_manager& operator = (const Example_output_manager&);
Example_output_manager& operator = (const string&);
~Example_output_manager();
 
int out_string1(std::string);
void out_string2(std::string);
};
#endif
Все каноны "Великих Сей Плюсплюс" соблюдены?
0
05.04.2012, 23:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2012, 23:38
Помогаю со студенческими работами здесь

ошибки линковки с++(...
помогите пожалуйста!! справится с ошибками линковки масив.obj : error LNK2001: unresolved external...

Ошибки линковки
Нужна помощь! Как исправить эти ошибки при компиляции! Все либы и заголовки дополнительные указаны...

[MPI] Ошибки линковки
Надо было написать проект который складывает числа в массиве. И выводит сумму. Одно из требований...

Ошибки на стадии линковки
obj\Release\main2.o:main2.cpp|| undefined reference to `__gxx_personality_sj0'|...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru