JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=0a517b0155c32cd330c85e4876108cabMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Include Guards bei DLLs

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 18.02.2007, 03:06    Titel: Include Guards bei DLLs Antworten mit Zitat

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
CPP:
#pragma once

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
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 18.02.2007, 09:18    Titel: Antworten mit Zitat

Wie wär's wenn du uns die Fehlermeldungen gibst. Wink
_________________
»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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 18.02.2007, 12:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Deviloper
Junior JLI'ler



Anmeldedatum: 31.05.2006
Beiträge: 77

Medaillen: Keine

BeitragVerfasst am: 20.02.2007, 11:07    Titel: Antworten mit Zitat

extern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 21.02.2007, 07:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 21.02.2007, 13:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Tobias
Mini JLI'ler


Alter: 34
Anmeldedatum: 20.02.2003
Beiträge: 13

Medaillen: Keine

BeitragVerfasst am: 21.02.2007, 13:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum