amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > C++ und GetInterface (OS4) Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

27.03.2005, 22:33 Uhr

Timo
Posts: 13
Nutzer
Ich versuche gerade zum ersten Mal über C++ (g++ Compiler) eine OS4-Library zu öffnen.

Alle Libraries, die über -lauto automatisch eingebunden werden, funktionieren einwandfrei. Andere müssen ja erst über OpenLibrary() und GetInterface() geöffnet werden. Unter C kann ich das, aber bei C++ will ich eine Library (guigfx) in einem Konstruktor öffnen und da kriege ich nen Linker-Fehler:
"undefined reference to 'IGuiGFX'"

Das ist mein Header (aufs Wesentliche gekürzt):

-------------------------------------------------------
#ifndef _INUDISPLAY_
#define _INUDISPLAY_

#include <intuition/intuition.h>
#include <graphics/gfx.h>
#include <interfaces/guigfx.h>
#include "InuImage.h"

class InuDisplay
{
public:
InuDisplay(short width, short height);
~InuDisplay();

private:
struct Library *GuiGFXBase;
struct GuiGFXIFace *IGuiFX;
};

#endif

-------------------------------------------------------
Und hier die Klasse (ebenfalls gekürzt):
-------------------------------------------------------
#include <iostream>
#include "InuDisplay.h"
using namespace std;

#include <proto/exec.h>
#include <proto/guigfx.h>

InuDisplay::InuDisplay(short width, short height)
{
GuiGFXBase = NULL;
IGuiGFX = NULL;
// === open guigfx.library ===

GuiGFXBase = IExec->OpenLibrary("guigfx.library", 20);

if (!GuiGFXBase)
{
cout << "could not open guigfx.library" << endl;
return;
}

IGuiGFX = (GuiGFXIFace*)IExec->GetInterface(GuiGFXBase, "main", 1, NULL);

if (!IGuiGFX)
{
cout << "could not get interface from guigfx" << endl;
return;
}

}

InuDisplay::~InuDisplay()
{
if (IGuiGFX) IExec->DropInterface((Interface*)IGuiGFX);
if (GuiGFXBase) IExec->CloseLibrary(GuiGFXBase);
}

-------------------------------------------------------------

Beim Kompilieren der einzelnen Dateien gibt es keine Probleme, nur linken will er nicht.
Weiß jemand Rat??

[ - Antworten - Zitieren - Direktlink - ]

28.03.2005, 01:22 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
struct GuiGFXIFace *IGuiFX;

Nenn es IGuiGFX, dann müßte es gehen.

Es gibt eine Precompiler-Variable, die verhindert, daß die Library-Base im Include-File angelegt wird. __NO_LIBBASE oder so, mußt du mal in dem Include-File nachschauen. Wenn du die setzt, meckert schon der Compiler, weil er die Variable nicht findet, und nicht erst der Linker.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

28.03.2005, 19:51 Uhr

Timo
Posts: 13
Nutzer
Kein schlechter Tipp :-)
Irgendwie war mir klar, dass das so ein Quatsch ist, aber finden tut
man sowas selten selber...

Ansonsten ists noch sinnvoll, die Library-Variablen global zu definieren,
dann kann man die Libs auch in anderen Klassen benutzen.

[ - Antworten - Zitieren - Direktlink - ]

28.03.2005, 20:55 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von Timo:
Ansonsten ists noch sinnvoll, die Library-Variablen global zu definieren,
dann kann man die Libs auch in anderen Klassen benutzen.


Dann solltest du es aber auch tun.

Zitat:
private:
struct Library *GuiGFXBase;
struct GuiGFXIFace *IGuiFX;


Oder ?

Darum ging es mir aber auch gar nicht.

Es geht darum, daß in proto/guigfx.h die Deklaration so aussieht:

extern struct GuiGFXIFace *IGuiGFX;

d.h. die Lib ist in allen Modulen bekannt. Aber wenn du sie nicht irgendwo auch noch selbst definierst, meckert der Linker.

Da du nun ein IGuiGFX in deinem Programm hast, wäre es sinnvoll, wenn du die Include-Datei so einbindest, daß IGuiGFX dort nicht nochmal deklariert wird. Dann hättest du den Fehler vielleicht eher gefunden, weil der *Compiler* dir gesagt hätte, es gäbe keine Variable IGuiGFX. Eine einfache Suche im Quelltext mit dem Editor hätte dir gezeigt, daß er Recht hat und du wärst schnell auf den Tippfehler gestoßen.

Es geht ja nur um die Datei, in der du GuiGFXIFace selbst deklarierst. In allen anderen Dateien, ist die Deklaration im Include-File ja korrekt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > C++ und GetInterface (OS4) Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.