Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

1

07.05.2006, 12:09

Bei Globalen Variablen kommt redefinition

Hi,

Ich Arbeite schon seit ein Paar Monaten an einem Grösserem Projekt... FastStream... des ist ne Dll mit einem Haufen Funktionen um in Dateien zu schreiben.

Habe gestern mal die logbuchfunktionen Aktualisiert, und habe dazu aber ein Paar globale Variablen gebraucht. Habe dann erstmal überlegt, wie ich des machen soll... Bin dann zu dem Entschluss gekommen, das ich es(so wie bei der TriBase) in dem Allgemeinen Include mache(heist: FastStream.h).

So dann kahmen aber Folgende Fehler:(Habe mal des Ganze Output Kopiert...)

Quellcode

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
34
35
36
37
38
39
40
41
42
43
44
45
46
------ Build started: Project: FastStream, Configuration: Debug Win32 ------
Compiling...
fsData.cpp
fsInfo.cpp
z:\faststream\src\fsinfo.cpp(49) : warning C4996: 'strcpy' was declared deprecated
        c:\programme\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
        Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
z:\faststream\src\fsinfo.cpp(50) : warning C4996: 'strcpy' was declared deprecated
        c:\programme\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
        Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
z:\faststream\src\fsinfo.cpp(51) : warning C4996: 'strcpy' was declared deprecated
        c:\programme\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
        Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
fsIO.cpp
fsLegnth.cpp
z:\faststream\src\fslegnth.cpp(33) : warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
fsList.cpp
fsLog.cpp
fsMain.cpp
fsMessage.cpp
fsScreen.cpp
Generating Code...
Compiling resources...
Compiling manifest to resources...
Linking...
fsInfo.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsInfo.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsIO.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsIO.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsLegnth.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsLegnth.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsList.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsList.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsLog.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsLog.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsMain.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsMain.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsMessage.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsMessage.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
fsScreen.obj : error LNK2005: "char * g_cAppName" (?g_cAppName@@3PADA) already defined in fsData.obj
fsScreen.obj : error LNK2005: "int g_iDllState" (?g_iDllState@@3HA) already defined in fsData.obj
   Creating library Z:\FastStream\Debug\FastStreamD.lib and object Z:\FastStream\Debug\FastStreamD.exp
Z:\FastStream\Debug\FastStreamD.dll : fatal error LNK1169: one or more multiply defined symbols found
Build log was saved at "file://z:\FastStream\Debug\BuildLog.htm"
FastStream - 17 error(s), 4 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Hier noch ein Paar Infos zu dem Include:

Ich habe ganz oben folgenden code hingeschrieben:

C-/C++-Quelltext

1
2
#ifndef FASTSTREAM_H
#define FASTSTREAM_H


und ganz unten das hier:

C-/C++-Quelltext

1
#endif


Soweit ich weis, sollte des ja solche Probleme verhindern.

Noch was: Ich benutze VC++ 2005.

mfg,

Faule Socke

Anonymous

unregistriert

2

07.05.2006, 12:13

Inkludeguards benutzen und Globale Variabeln direkt vergessen, hat schon seinen Grund wieso globale Variablen von erfahrenen Coder verhasst sind.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

07.05.2006, 12:40

globale Variablen im Header als extern und in der Lib Definiert?

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

4

07.05.2006, 12:44

Zitat von »"grek40"«

globale Variablen im Header als extern und in der Lib Definiert?


Ja als extern, aber wie meinst du des mit in der Lib?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

07.05.2006, 12:46

extern ist eine Deklaration - es muss also auch eine Definition geben in der .cpp - das mit der Lib war bisschen ungünstig ausgedrückt.

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

6

07.05.2006, 12:47

Zitat von »"grek40"«

extern ist eine Deklaration - es muss also auch eine Definition geben in der .cpp - das mit der Lib war bisschen ungünstig ausgedrückt.


Lerne gerade erst C++, wie soll ich des denn mit der Definition machen?


mfg,

Faule Socke

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

07.05.2006, 12:50

test.h:

C-/C++-Quelltext

1
2
3
4
5
6
#ifndef _TEST_H
#define _TEST_H

extern int test;

#endif // _TEST_H


test.cpp:

C-/C++-Quelltext

1
2
3
#include "test.h"

int test=0;


// natürlich das ganze noch für den export in die DLL aufbereiten.

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

8

13.05.2006, 20:58

Zitat von »"grek40"«


natürlich das ganze noch für den export in die DLL aufbereiten.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Wenn ich mich net tausche, meinst du mit für den Export in die DLL aufbereiten das hier:



int test=0;


int GetTest()
{
// Zeiger auf Variable zurückgeben

return &test;
}


mfg,

Faule Socke

Anonymous

unregistriert

9

13.05.2006, 21:07

1. Was hat das mit DLLs zu tun?
2. Vergiss globale Variablen - es sei denn Du willst ein grottiger Coder werden.

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

10

13.05.2006, 21:36

Oh habe noch was vergessen...

C-/C++-Quelltext

1
2
// Der Funktionsheader sollte dann so aussehen:

FASTSTREAM_API void GetTest()


@nix da:
Durch aufruf der Funktion erhält man einen Zeiger auf die Globale Variable und kann sie dann verändern oder ansehen!

mfg,

Faule Socke

Werbeanzeige