LNK2005: "class UHL::Keyboard KeyBoard" (?KeyBoard@@3VKeyboard@UHL@@A) already defined in KeyBoardSo – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

LNK2005: "class UHL::Keyboard KeyBoard" (?KeyBoard@@3VKeyboard@UHL@@A) already defined in KeyBoardSo – C / C++ – Fórum – Programujte.comLNK2005: "class UHL::Keyboard KeyBoard" (?KeyBoard@@3VKeyboard@UHL@@A) already defined in KeyBoardSo – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hajrus0
Newbie
12. 4. 2014   #1
-
0
-

Dobrý den, předem se omlouvám, že Vás zatěžu touto hloupou otázkou. Sám nemám rád, když někdo chce po druhých, aby za něj dělali špinavou práci.

Můj problém:
Ve VC++ mám projekt. V něm mám  tyto soubory:

  • Definitions.h
  • FrameWork_Functions.h
  • Scene.h
  • UHL_OPENGL.h

...............................................................

  • KeyBoardSource.cpp
  • main.cpp
  • UHL_OPENGL.cpp

main.cpp

#define GLFW_INCLUDE_GLU




#include <glfw3.h>

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

//Projects H.
#include "UHL_OPENGL.h"
#include "Definitions.h"
#include "scene.h"
#include "FrameWork_Functions.h"





int main()
{
.......
.......
}

UHL_OPENGL.h
 

#ifndef UHL_OPENGL_H
#define UHL_OPENGL_H


namespace UHL
{
     .........
     .........
     .........
     .........

	/*Keyboard*/
	class Keyboard
	{
		
	public:
		Keyboard();
		bool Key[16];

		static void KeyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods);

	    void KeyPress(int KeyId);
		void KeyRelease(int KeyId);
		void KeyChange(int KeyId);

		bool GetKey(int KeyId);
	};

	
}



#endif

KeyBoardSource.cpp


#include <glfw3.h>

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


#include "UHL_OPENGL.h"
#include "Definitions.h"

void UHL::Keyboard::KeyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
		glfwSetWindowShouldClose(window, GL_TRUE);
	if (key == GLFW_KEY_A && action == GLFW_PRESS)
		KeyBoard.KeyPress(KEY_A);

}

Definitions.h

#ifndef DEFINITIONS_H
#define DEFINITIONS_H

UHL::Keyboard KeyBoard;

#endif

FrameWork_Functions.h

#ifndef FRAMEWORK_H
#define FRAMEWORK_H


static void error_callback(int error, const char* description)
{
	fputs(description, stderr);
}



namespace UHL
{
	void Init_GLFW(int width, int height, const char* tittle, bool fullscreen)
	{
		......
                ......
                ......

		glfwMakeContextCurrent(window);
		glfwSetKeyCallback(window, KeyBoard.KeyCallBack);
		Init_GL(window);
		
		.......
                .......
	}
	
}

#endif

1>main.obj : error LNK2005: "class UHL::Keyboard KeyBoard" (?KeyBoard@@3VKeyboard@UHL@@A) already defined in KeyBoardSource.obj
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library

Doposud jsem moc nepožíval kombinaci .h souborů s .cpp soubory. Původně jsem chtěl definovat 
UHL::Keyboard KeyBoard; v souboru UHL_OPENGL.h. Ovšem když jsem to tam dal, hodilo to LNK:2001. Proto jsem vytvořil soubor Definitions.h.

Předem Vám moc děkuji za odpověď.

Nahlásit jako SPAM
IP: 89.176.159.–
KIIV
~ Moderátor
+43
God of flame
12. 4. 2014   #2
-
0
-

#1 Hajrus
pouzij extern ....  v tom header souboru a v jednom z *.cpp pak toto bez extern...

extern znamena, ze se to jen nadeklaruje a bez externu je pak definovano... jen ta definice muze byt jen v jednom zdrojaku po slinkovani

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Radek Chalupa
~ Redaktor
+1
Super člen
12. 4. 2014   #3
-
0
-

#1 Hajrus
Sice nevím jaká je otázka  , ale pokud chceš funkci (včetně její definice samozřejmě) mít v hlavičkovém souboru, měl bys dát do její deklarace inline, jinak ti bude linker hlásit ty "multiple definice"...

Radek Chalupa 
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC) 
- vývoj software na zakázku 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
Hajrus0
Newbie
13. 4. 2014   #4
-
0
-

#2 KIIV
Nejsem si moc jistý, jestli jsem vaši odpověď pochopil.
Toto jste měl na mysli?

Definitions.h

#ifndef DEFINITIONS_H
#define DEFINITIONS_H

extern UHL::Keyboard KeyBoard;

#endif
Nahlásit jako SPAM
IP: 89.176.159.–
KIIV
~ Moderátor
+43
God of flame
13. 4. 2014   #5
-
0
-

#4 Hajrus
a do jednoho z tech cpp souboru dat

UHL::Keyboard KeyBoard;
 

ale jen do jednoho, kam bude patrit nejvic... (teda pokud se snazis o to, mit "globalni" promennou skrz vicero cpp souboru - jinak tu definici proste do headeru dat nesmis)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hajrus0
Newbie
13. 4. 2014   #6
-
0
-

#3 Radek Chalupa
Taktéž pokud jsem správně pochopil:

 UHL_OPENGL.h

	class Keyboard
	{
		
	public:
		Keyboard();
		bool Key[16];

		inline static void KeyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods);

	    void KeyPress(int KeyId);
		void KeyRelease(int KeyId);
		void KeyChange(int KeyId);

		bool GetKey(int KeyId);
	};

	
}



#endif

nicméně, poté mi to hlásí:

1>main.obj : error LNK2019: unresolved external symbol "public: static void __cdecl UHL::Keyboard::KeyCallBack(struct GLFWwindow *,int,int,int,int)" (?KeyCallBack@Keyboard@UHL@@SAXPAUGLFWwindow@@HHHH@Z) referenced in function "void __cdecl UHL::Init_GLFW(int,int,char const *,bool)" (?Init_GLFW@UHL@@YAXHHPBD_N@Z)
1>main.obj : error LNK2005: "class UHL::Keyboard KeyBoard" (?KeyBoard@@3VKeyboard@UHL@@A) already defined in KeyBoardSource.obj

Nahlásit jako SPAM
IP: 89.176.159.–
Hajrus0
Newbie
13. 4. 2014   #7
-
0
-

#5 KIIV
Vložil jsem to do KeyBoardSource.cpp

error C2086: 'UHL::Keyboard KeyBoard' : redefinition

Nahlásit jako SPAM
IP: 89.176.159.–
KIIV
~ Moderátor
+43
God of flame
13. 4. 2014   #8
-
0
-

tak bud delas neco blbe, nebo si polozil spatnou otazku... takhle nadalku se to rozjet proste neda

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hajrus0
Newbie
13. 4. 2014   #9
-
0
-

Problém vyřešen. Příčinou byla logická chyba, kterou jsem udělal ve funkci:

void UHL::Keyboard::KeyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
		glfwSetWindowShouldClose(window, GL_TRUE);
	if (key == GLFW_KEY_A && action == GLFW_PRESS)
		KeyBoard.KeyPress(KEY_A);

}

zde definuji funkci třídy a zároveň v té funkci mám uvedeno KeyBoard, tedy tu třídu, ve které právě definuji její funkci...

Nahlásit jako SPAM
IP: 89.176.159.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý