Форум программистов, компьютерный форум CyberForum.ru

LNK2005 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.08.2012, 13:23     LNK2005 #1
После долгой возни с cpp и их h решил сделать "по тупому" и скинуть все в stdafx.h, который все равно должен быть везде :< Ага.. скинул.. LNK2005 15 штук :<
#ifndef
#define
#endif
^-- Конструкция присутствует в каждом заголовочном файле.

Хочу заметить, что я ни разу extern не использовал. Считай, взял один файл и распихал по разным.
// Можете статейку подкинуть о модульном программировании? :<
Код одного stdafx.h
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
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
#include "targetver.h"
#include "resource.h"
 
#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
 
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <winsock2.h>
#include <vector>
 
#include "Defines.h"
#include "ServerClasses.h"
#include "GlobalVars.h"
 
#include "Chat Server.h"
 
#include "InitInstance.h"
#include "DlgProc.h"
#include "ServerFunctions.h"
 
// TODO: reference additional headers your program requires here


Ошибки
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>Chat Server.cpp
1>Linking...
1>stdafx.obj : error LNK2005: "unsigned short __cdecl MyRegisterClass(struct HINSTANCE__ *)" (?MyRegisterClass@@YAGPAUHINSTANCE__@@@Z) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPAUHINSTANCE__@@H@Z) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "int __stdcall DlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?DlgProc@@YGHPAUHWND__@@IIJ@Z) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "public: int __thiscall SERVER::Start(void)" (?Start@SERVER@@QAEHXZ) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "public: int __thiscall SERVER::Stop(void)" (?Stop@SERVER@@QAEHXZ) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "public: int __thiscall SERVER::GetStatus(void)" (?GetStatus@SERVER@@QAEHXZ) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "struct HWND__ * hDlg" (?hDlg@@3PAUHWND__@@A) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "struct WSAData wsaData" (?wsaData@@3UWSAData@@A) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "wchar_t * szWindowClass" (?szWindowClass@@3PA_WA) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "struct HINSTANCE__ * hInst" (?hInst@@3PAUHINSTANCE__@@A) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "wchar_t * szTitle" (?szTitle@@3PA_WA) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "struct HWND__ * hWnd" (?hWnd@@3PAUHWND__@@A) already defined in Chat Server.obj
1>stdafx.obj : error LNK2005: "class SERVER server" (?server@@3VSERVER@@A) already defined in Chat Server.obj
1>D:\VisualStudioPrograms\Other\Debug\Chat Server.exe : fatal error LNK1169: one or more multiply defined symbols found

По ним понятно, что нечто было уже определено, но если у меня в каждом файле структура ifndef, то как такое возможно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 13:23     LNK2005
Посмотрите здесь:

C++ Ошибки линковки LNK2005, LNK1169
C++ Linker error msvcprtd.lib(msvcp100d.dll) error lnk2005 already defined libcpmtd.lib
error LNK2005 C++
C++ error LNK2005
Ошибка LNK2005 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 14:18     LNK2005 #2
"по тупому" это использовать stdafx.h
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.08.2012, 16:58  [ТС]     LNK2005 #3
Jupiter, ну я так и написал

Добавлено через 2 часа 19 минут
up-to-date
До сих пор ищу, как же от этого избавиться ; (
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 17:15     LNK2005 #4
то, что ты сделал, эквивалентно следующему:

файл a.cpp:
C++
1
2
3
void foo (){
;
}
файл b.cpp:
C++
1
2
3
void foo (){
;
}
и компилишь и собираешь их вместе. они компилятся, а линкер не знает, которую ф-ю искользовать - из a или b

ты сделал именно это, но "сэкономил": включил одинаковые ф-ии во все практически модули сборки путем включения всех своих хидерных файлов.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.08.2012, 17:23  [ТС]     LNK2005 #5
novi4ok, но ведь stdafx.h подключается один раз в одном cpp-файле?
Или я тебя не правильно понял?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 17:31     LNK2005 #6
в stdafx.h надо выносить только стандартные хедеры (или хедеры сторонних библиотек). свои туда лучше не выносить.
у тебя stdafx.h объявлен как precompile?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 17:43     LNK2005 #7
Цитата Сообщение от nexen Посмотреть сообщение
novi4ok, но ведь stdafx.h подключается один раз в одном cpp-файле?
Или я тебя не правильно понял?
задай поиск по проекту на stdafx.h, и увидишь, где он подключается.
правило хорошей практики: пиши #include something.h только там, где он действительно нужен. написать его несколько раз - потратишь значительно меньше времени, чем на поиски "а что же это у миня такои!"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 17:52     LNK2005 #8
Цитата Сообщение от nexen Посмотреть сообщение
По ним понятно, что нечто было уже определено, но если у меня в каждом файле структура ifndef, то как такое возможно?
но ведь stdafx.h подключается один раз в одном cpp-файле?
Структрура #ifndef срабатывает при множественном включении содержимого заголовочного файла в один файл. А у вас их два: stdafx.cpp и Server.cpp. Препроцессор не может определить наличие одинаковых выражений в разных файлах, а компоновщик их видит.
.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 17:59     LNK2005
Еще ссылки по теме:

Сборка многофайлового приложения: ошибка LNK2005 C++
Компиляция выдает ошибку "error LNK2005: _main уже определен в int.obj" C++
C++ Ошибка 19 error LNK2005. Многофайловое приложение

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

Или воспользуйтесь поиском по форуму:
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.08.2012, 17:59  [ТС]     LNK2005 #9
I.M., таки правда. Все дело в формировании pch. Спасибо всем. Вопрос закрыт
Yandex
Объявления
23.08.2012, 17:59     LNK2005
Ответ Создать тему
Опции темы

Текущее время: 15:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru