Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 18.02.2007, 03:06 Titel: Include Guards bei DLLs |
|
|
Hi
Ich habe in einer DLL zwei Dateien, die eine andere includieren. Nur krieg ich dabei lauter linker Fehler(xyz already defined in abc.obj). Die include guards helfen hier gar nichts egal ob ich
oder
CPP: | #ifndef xyz
#define xyz
[...]
#endif |
schreibe.
Wie macht man sowas richtig? Denn hier und und ein paar anderen tuts scheint es ja problemlos zu funktionieren.
Hab das Prob schon seit n paar Monaten habs dann aber immer weiter verschoben, aber jetzt will ichs endlich mal wissen.
Hoffe ihr könnt helfen.
MfG 51m0n _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 18.02.2007, 09:18 Titel: |
|
|
Wie wär's wenn du uns die Fehlermeldungen gibst. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 18.02.2007, 12:18 Titel: |
|
|
hab ich doch oben schon mehr oder weniger.
Hier ist die nochmal genau:
Code: | error LNK2005: "int math::type" (?type@math@@3HA) already defined in fmath.obj |
So und in der global.h steht:
CPP: | #pragma once
namespace math
{
int type = 0;
} |
Diese wird von mehreren Dateien includiert, in normalen Projekten wird ducrh #pragma once ja verhindert das die Variable mehrmals definiert wird. Bei einer Dll funktioniert das nicht.(zumindest nich bei mir) _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 20.02.2007, 11:07 Titel: |
|
|
extern |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 21.02.2007, 07:31 Titel: |
|
|
Du müsstest prinzipiell 2 Header für DLL's basteln - meisstens verwendet man aber nur einen Header und überprüft ein Makro auf Existenz.
Im Visual Studio wird für ein Win32-DLL-Projekt Namens "XYZ" in den Compilereinstellungen ein Makro mit dem Namen "XYZ_EXPORTS" erzeugt.
In Headern, welche jetzt zu exportierende Funktionen enthalten wird ein neben einem Includeguard noch folgendes Makro verwendet:
CPP: | #ifdef XYZ_EXPORTS
#define XYZ_API declspec(dllexport)
#else
#define XYZ_API declspec(dllimport)
#endif
|
Funktionen die in Dlls jetzt Exportiert und von Projekten importiert werden nutzen jetzt folgende definition:
CPP: | XYZ_API int MeineFunktion(int Parameter);
|
_________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 21.02.2007, 13:01 Titel: |
|
|
AFE-GmdG hat Folgendes geschrieben: | Du müsstest prinzipiell 2 Header für DLL's basteln - meisstens verwendet man aber nur einen Header und überprüft ein Makro auf Existenz.
Im Visual Studio wird für ein Win32-DLL-Projekt Namens "XYZ" in den Compilereinstellungen ein Makro mit dem Namen "XYZ_EXPORTS" erzeugt.
In Headern, welche jetzt zu exportierende Funktionen enthalten wird ein neben einem Includeguard noch folgendes Makro verwendet:
CPP: | #ifdef XYZ_EXPORTS
#define XYZ_API declspec(dllexport)
#else
#define XYZ_API declspec(dllimport)
#endif
|
Funktionen die in Dlls jetzt Exportiert und von Projekten importiert werden nutzen jetzt folgende definition:
CPP: | XYZ_API int MeineFunktion(int Parameter);
|
|
Du scheinst meine Frage nicht ganz verstanden zu haben. Ich weis, wie man dlls erzeugt usw., aber ich weis nicht warum ich eine Headerdatei nicht mehrnals includen darf(trotz include guard). Hat wohl irgendwas mit dem Einstiegspunkt zu tun, denn der is ja je nach dem welche Funktion ich aufrufe immer anders!?
Kann mir im mom nur helfen, indem ich alles in eine Datei packe, was sehr unübersichtlich wird :/.
Gibt es bei VC++ auch so etwas in der art wie regions bei VC#?
@Deviloper:
Ne das bringt auch nix.
MfG 51m0n _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Tobias Mini JLI'ler
Alter: 34 Anmeldedatum: 20.02.2003 Beiträge: 13
Medaillen: Keine
|
Verfasst am: 21.02.2007, 13:33 Titel: |
|
|
Du kannst in Dlls keine Variablen exportieren. Du kannst eine Variable in einer Dll nur durch entsprechende Set-/Get-Funktionen manipulieren. Ansonsten hat Devlioper recht, auch ohne Dll kann sowas nur mit extern funktionieren, sobald du die Datei in mehrere Cpp Dateien includest.
Header: extern int type;
In EINER Cpp-Datei: int type = 0; _________________ http://www.alphanew.net/ (Last update: 10.12.2006)
|
|
Nach oben |
|
|
|