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

amiga-news.de Forum > Programmierung > Weitere GCC Anfängerprobleme [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

02.03.2005, 18:40 Uhr

Reth
Posts: 1858
Nutzer
Tja, ich bins schon wieder,

nun kann ich mal ein bisschen weitermachen beim Portieren meiner Sourcen und stecke schon wieder fest.

Ich verwende in einer Klasse die Funktion AllocAslRequestTags().
Dazu öffne ich in dieser Klasse die asl.library.

Beim Linken kommen dann folgende Fehler (mit der graphics.library dasselbe, nur hier besteht im Source kein OpenLibrary() Aufruf, dennoch der gleiche Fehler):

/gg/lib/libamiga.a(allocaslrequesttags.o)(.text+0x4): undefined reference to 'AslBase'
/gg/lib/libamiga.a(aslrequesttags.)(.text+0x4): undefined reference to 'AslBase'
/gg/lib/libamiga.a(finddisplayinfo.o)(.text+0x4): undefined reference to 'GfxBase'
/gg/lib/libamiga.a(getdisplayinfodata.o)(.text+0x6): undefined reference to 'GfxBase'
collect2: ld returned 1 exit status

Muss ich die Objektfiles der Libraries beim Make mit angeben?

Hier mal das MakeFile:

projectPath = <Pfad>

WizardWars : ScreenModeRequestC.o ScreenModeDataC.o ScreenModeHookC.o WizardWars.o
g++ -I $(projectPath) -o WizardWars ScreenModeDataC.o ScreenModeRequestC.o ScreenModeHookC.o WizardWars.o

WizardWars.o : WizardWars.cc ScreenModeRequestC.h ScreenModeHookC.h
g++ -I $(projectPath) -c WizardWars.cc
ScreenModeRequestC.o : ScreenModeRequestC.cc ScreenModeRequestC.h ScreenModeDataC.h
g++ -I $(projectPath) -c ScreenModeRequestC.cc
ScreenModeDataC.o : ScreenModeDataC.cc ScreenModeDataC.h
g++ -I $(projectPath) -c ScreenModeDataC.cc
ScreenModeHookC.o : ScreenModeHookC.cc ScreenModeHookC.h Constants.h
g++ -I $(projectPath) -c ScreenModeHookC.cc

clean :
delete ScreenModeHookC.o ScreenModeDataC.o ScreenModeRequestC.o WizardWars.o

Ausgeführt wird es bis zu genannten Fehlern beim Linken!

Danke schon mal
Ciao

[ Dieser Beitrag wurde von Reth am 02.03.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

03.03.2005, 08:10 Uhr

Reth
Posts: 1858
Nutzer
Weiss denn wirklich keiner wo das Problem liegen könnte?

Wer GCC nutzt: Wie linkt ihr eure Sourcefiles, die Zugriffe auf AOS-Libraries verwenden?

[ - Antworten - Zitieren - Direktlink - ]

03.03.2005, 09:49 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Reth:
Ich verwende in einer Klasse die Funktion AllocAslRequestTags().
Dazu öffne ich in dieser Klasse die asl.library.

Die Librarybasis ist hier also (Klassen-)lokal?
Zitat:
Beim Linken kommen dann folgende Fehler (mit der graphics.library dasselbe, nur hier besteht im Source kein OpenLibrary() Aufruf, dennoch der gleiche Fehler):

/gg/lib/libamiga.a(allocaslrequesttags.o)(.text+0x4): undefined reference to 'AslBase'
/gg/lib/libamiga.a(aslrequesttags.)(.text+0x4): undefined reference to 'AslBase'
/gg/lib/libamiga.a(finddisplayinfo.o)(.text+0x4): undefined reference to 'GfxBase'
/gg/lib/libamiga.a(getdisplayinfodata.o)(.text+0x6): undefined reference to 'GfxBase'
collect2: ld returned 1 exit status

Dein Programm enthält Aufrufe zu diesen Funktionen und der Linker findet sie in libamiga.a! Alle in libamiga.a enthaltenen Funktionen brauchen eine _globale_ Librarybasis. Falls die Funktionen ohne Stub aufgerfufen werden können, gehts auch mit einer lokalen Basis die Du selber mit OpenLibrary() belegen mußt. Für die graphics.library Funktionen sollte das auch klappen. Also am Anfang "#include <proto/graphics.h>, GfxBase sichtbar deklarieren und mit OpenLibrary initialisieren. AllocAslRequestTags ist eine Hilfsfunktion um AllocAslRequest(). Die sollte auch ohne Stub aufgelöst werden können, wenn Du <proto/asl.h> einbindest. Die verwendete Methode, um solche varsargs-Funktionen aufzulösen, erzeugt aber bescheidenen Code.

[ - Antworten - Zitieren - Direktlink - ]

03.03.2005, 10:11 Uhr

Reth
Posts: 1858
Nutzer
Zitat:
Original von gni:

Die Librarybasis ist hier also (Klassen-)lokal?


Allerdings.

Zitat:
Dein Programm enthält Aufrufe zu diesen Funktionen und der Linker findet sie in libamiga.a! Alle in libamiga.a enthaltenen Funktionen brauchen eine _globale_ Librarybasis.

Danke für den Hinweis! Wo kann man denn solche Zusammenhänge in Erfahrung bringen?

Zitat:
Falls die Funktionen ohne Stub aufgerfufen werden können, gehts auch mit einer lokalen Basis die Du selber mit OpenLibrary() belegen mußt. Für die graphics.library Funktionen sollte das auch klappen. Also am Anfang "#include <proto/graphics.h>, GfxBase sichtbar deklarieren und mit OpenLibrary initialisieren.

Also müsste das innerhalb der verwendenden Klasse langen (nur Pseudocode, werfe hier mal Definition und Deklaration zusammen):

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

class A {

private struct Library *gfxBase = (struct Library *)OpenLibrary("graphics.library", 38);

...
}

Zitat:
AllocAslRequestTags ist eine Hilfsfunktion um AllocAslRequest(). Die sollte auch ohne Stub aufgelöst werden können, wenn Du <proto/asl.h> einbindest. Die verwendete Methode, um solche varsargs-Funktionen aufzulösen, erzeugt aber bescheidenen Code.

Was wäre denn eine bessere Alternative und viel wichtiger:
Wie kann ich denn herausbekommen, welcher Code weniger gut/effizient bzw. bescheidener ist? Nur mit Benchmarks?

Danke nochmals
Ciao

[ - Antworten - Zitieren - Direktlink - ]

03.03.2005, 11:12 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Reth:
Zitat:
gni:
Die Librarybasis ist hier also (Klassen-)lokal?

Allerdings.
Das funktionslokal geht hatte ich erwartet, aber auch klassenlokal geht :-)
Zitat:
Zitat:
Dein Programm enthält Aufrufe zu diesen Funktionen und der Linker findet sie in libamiga.a! Alle in libamiga.a enthaltenen Funktionen brauchen eine _globale_ Librarybasis.
Danke für den Hinweis! Wo kann man denn solche Zusammenhänge in Erfahrung bringen?
Was meinst Du? Das amiga.lib Funktionen globale Librarybasen brauchen? Wie soll eine externe Funktion sonst die entsprechende Bibliothek finden? Immer selber OpenLibrary() machen? Das wäre äußerst ineffizient.
Zitat:
Also müsste das innerhalb der verwendenden Klasse langen (nur Pseudocode, werfe hier mal Definition und Deklaration zusammen):
#include <proto/graphics.h>
#include <proto/exec.h>
class A {
private struct Library *gfxBase = (struct Library *)OpenLibrary("graphics.library", 38);
...
}

Da es eine lokale Basis ist, kannst Du "struct Library *" nehmen. Die globale Basis (::GfxBase) ist aber vom Typ "struct GfxBase *). Und es _muß_ *GfxBase* heissen! Das ist wichtig! Was nicht geht, ist initialisieren in der Deklaration (das liegt an der Art der GCC Inlines), dh. es könnte so ausssehen:
class A {
private:
struct Library *SysBase, *GfxBase;
// "richtige" Typen
// struct ExecBase *SysBase;
// struct GfxBase *GfxBase;
public:
foo() :
SysBase(reinterpret_cast<struct Library *>(::SysBase),
// oder so
//SysBase(*(struct Library **)4L)
// oder mit dem "richtigen Typ
//SysBase(::SysBase),
//SysBase(*(struct ExecBase **)4L)
GfxBase(reinterpret_cast<struct Library *>(::GfxBase))
// oder so
//GfxBase(OpenLibrary("graphics.library", VERSION))
// oder mit dem "richtigen Typ
//GfxBase(::GfxBase)
//GfxBase(reinterpret_cast<struct GfxBase *>(OpenLibrary("graphics.library", VERSION)))
{
}
...
}
Die globalen ::Variablen zu nehmen hat den Vorteil, daß die Bibliotheken nur einmal geöffnet werden und man sie in seiner Klasse "cached". Dann mußt Du aber sicherstellen, daß die Bibliotheken auch wirklich geöffnet sind. Beim Linken mit "-noixemul" ist das der Fall.
Zitat:
Zitat:
AllocAslRequestTags ist eine Hilfsfunktion um AllocAslRequest(). Die sollte auch ohne Stub aufgelöst werden können, wenn Du <proto/asl.h> einbindest. Die verwendete Methode, um solche varsargs-Funktionen aufzulösen, erzeugt aber bescheidenen Code.
Was wäre denn eine bessere Alternative und viel wichtiger:
Wie kann ich denn herausbekommen, welcher Code weniger gut/effizient bzw. bescheidener ist?

Wenn Du die proto-Header verwendest, werden nie externe Aufrufe erzeugt (wenn denn im Inline auch alle Funktionen enthalten sind), dh. Dir kann es egal sein. Das ganze ist auch mehr eine Frage der Aesthaetik ;-)

[ Dieser Beitrag wurde von gni am 03.03.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Weitere GCC Anfängerprobleme [ - Suche - Neue Beiträge - Registrieren - Login - ]


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