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

amiga-news.de Forum > Programmierung > Morphos Includes Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

23.09.2005, 10:38 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Ich habe ein Problem, ich wollte für MOS etwas machen und habe mir für Linux einen CrossCompiler installiert, dnn das SDK (vom GoldED Dev Env), nun kann ich meinen Source nicht compilieren das der Compiler einigen Library Funktionen nicht finden kann... z.B OpenWindowTags() oder MUI_NewObject(), ich habe mir einige Files aus clib/ und die dazugehörigen aus ppcinlines angeschaut und bin irgendwie erstaunt dass dort sich für mich Wiedersprechende definitionen sind

clib:
code:
Object *MUI_NewObjectA         (char *classname,struct TagItem *tags);
#if !defined(USE_INLINE_STDARG)
Object *MUI_NewObject          (char *classname,Tag tag1,...);
#endif
[code]

ppcinlines:
[code]
#ifdef USE_INLINE_STDARG

#include <stdarg.h>

...

#define MUI_NewObject(__p0, ...) \
	({ULONG _tags[] = { __VA_ARGS__ }; \
	MUI_NewObjectA(__p0, (struct TagItem *)_tags);})

...
#endif


irgendwie ist das mit den USE_INLINE_STDARG komisch, da die Funktion in clib deklariert wird wenn dieses MAkro nicht deiniert ist, sie wird aber nur Definiert wenn es das Makro gibt...

Da ich aber auf dieses Problem nirgendwo in Foren gestolpert bin heisst es für mich dass ich wohl einfachnur blöde bin.

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 10:41 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Irgendwie ist oben was schief gelaufen... und ich kann den Beitrg nicht editieren

[ Dieser Beitrag wurde von DariusBrewka am 23.09.2005 um 10:42 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 10:57 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
Ich habe ein Problem, ich wollte für MOS etwas machen und habe mir für Linux einen CrossCompiler installiert, dnn das SDK (vom GoldED Dev Env), nun kann ich meinen Source nicht compilieren das der Compiler einigen Library Funktionen nicht finden kann... z.B OpenWindowTags() oder MUI_NewObject(), ich habe mir einige Files aus clib/ und die dazugehörigen aus ppcinlines angeschaut und bin irgendwie erstaunt dass dort sich für mich Wiedersprechende definitionen sind

clib:
code:
Object *MUI_NewObjectA         (char *classname,struct TagItem *tags);
#if !defined(USE_INLINE_STDARG)
Object *MUI_NewObject          (char *classname,Tag tag1,...);
#endif


ppcinlines:
code:
#ifdef USE_INLINE_STDARG

#include <stdarg.h>

...

#define MUI_NewObject(__p0, ...) \
	({ULONG _tags[] = { __VA_ARGS__ }; \
	MUI_NewObjectA(__p0, (struct TagItem *)_tags);})

...
#endif


irgendwie ist das mit den USE_INLINE_STDARG komisch, da die Funktion in clib deklariert wird wenn dieses MAkro nicht deiniert ist, sie wird aber nur Definiert wenn es das Makro gibt...

Da ich aber auf dieses Problem nirgendwo in Foren gestolpert bin heisst es für mich dass ich wohl einfachnur blöde bin.



--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 11:04 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
irgendwie ist das mit den USE_INLINE_STDARG komisch, da die Funktion in clib deklariert wird wenn dieses MAkro nicht deiniert ist, sie wird aber nur Definiert wenn es das Makro gibt...


Für mich sieht das auf den ersten Blick korrekt aus. Wenn USE_INLINE_STDARG definiert ist, ist MUI_NewObject(...) ein Makro, wenn es nicht definiert ist, eine externe Funktion, die hinzugelinkt werden muß.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 11:07 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Aber wo ist es dann definiert? in clib ist es nur deklariert aber definiert wird es in ppcincludes oder sehe ich das falsch?

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 11:22 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von DariusBrewka:
Ich habe ein Problem, ich wollte für MOS etwas machen und habe mir für Linux einen CrossCompiler installiert, dnn das SDK (vom GoldED Dev Env), nun kann ich meinen Source nicht compilieren das der Compiler einigen Library Funktionen nicht finden kann... z.B OpenWindowTags() oder MUI_NewObject(), ich habe mir einige Files aus clib/ und die dazugehörigen aus ppcinlines angeschaut und bin irgendwie erstaunt dass dort sich für mich Wiedersprechende definitionen sind

clib:
code:
Object *MUI_NewObjectA         (char *classname,struct TagItem *tags);
#if !defined(USE_INLINE_STDARG)
Object *MUI_NewObject          (char *classname,Tag tag1,...);
#endif


ppcinlines:
code:
#ifdef USE_INLINE_STDARG

#include <stdarg.h>

...

#define MUI_NewObject(__p0, ...) \
	({ULONG _tags[] = { __VA_ARGS__ }; \
	MUI_NewObjectA(__p0, (struct TagItem *)_tags);})

...
#endif


irgendwie ist das mit den USE_INLINE_STDARG komisch, da die Funktion in clib deklariert wird wenn dieses MAkro nicht deiniert ist, sie wird aber nur Definiert wenn es das Makro gibt...

Da ich aber auf dieses Problem nirgendwo in Foren gestolpert bin heisst es für mich dass ich wohl einfachnur blöde bin.


Das ist nicht komich ;) Alle Funktionen, welche auch in einer Version für Parameterübergabe per TagList existieren, sind so oder so ähnlich deklariert.

Es gibt mehrere Methoden, diese Funktionen zu benutzen. Da sind einmal die Stub-Funktionen der C Lib

clib:
code:
Object *MUI_NewObjectA         (char *classname,struct TagItem *tags);
#if !defined(USE_INLINE_STDARG)
Object *MUI_NewObject          (char *classname,Tag tag1,...);
#endif


das #if dient dazu, die Stub-Funktion nur dann zu benutzen, wenn man nicht mittels der Inline-Makros für diesen Zweck arbeiten möchte (empfehlenswert).

Wenn USE_INLINE_STDARG definiert ist, wird statt der Stub-Funktion der C Lib ein aus einem Makro generierter Funktionseinsprung verwendet, z.B. dieser hier

#define MUI_NewObject(__p0, ...) \
({ULONG _tags[] = { __VA_ARGS__ }; \
MUI_NewObjectA(__p0, (struct TagItem *)_tags);})

Damit wird die TagList aus dem Parameter in ein TagItem-Array gepackt und schlußendlich MUI_NewObjectA() übergeben. Eine Stub-Funktion ist auf diesem Weg nicht notwendig und somit auch kein Linken gegen eine bestimmte Lib.

Wenn der Compiler also meckert, weil er eine Funktion nirgends findet, stimmt bei Dir etwas mit der entsprechenden Lib nicht, die die Stub-Funktionen enthält. Entweder wird die nicht dazu gelinkt oder sie enthält die Stubs nicht (aus welchem Grund auch immer, hab mich nie mit Crosscompilern auseinandergesetzt).

Definiere spaßeshalber mal vor dem Compile USE_INLINE_STDARG und schau, was passiert. Normalerweise sollte das Gemecker nun aufhören. Ist das der Fall, solltest Du Dir die Lib nochmal näher anschauen, die die entsprechenden Stubs enthalten sollte.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 11:27 Uhr

whose
Posts: 2156
Nutzer
@DariusBrewka:

"Definiert" ist die Funktion in der Linker-Bibliothek. Sie wird bei Bedarf dann halt einfach dazu gelinkt. Alle Includes, die sich darauf beziehen, enthalten (logischerweise) nur die Deklarationen.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 11:45 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Ist OK hab's schon geschafft muss aboxstubs linken, war halt nur komisch und wenn ich -D USE_INLINE_STDARG nutze geht's überhaupt nicht, dann kommen lauter Fehler (unterminated macro call). So hat er aber Alles fehlerfrei übersetzt.

Normalerweise gibt's dann halt libmui.a, aber da es das auf MOS nicht gibt, habe ich halt gedacht ich müsste inlines nehmen. Dachte mir aber das MUI auf MOS zum System gehört und aus diesem Grund auch in einer systemlib integriert sein muss...

Danke an alle

[ Dieser Beitrag wurde von DariusBrewka am 23.09.2005 um 11:47 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 12:08 Uhr

gni
Posts: 1106
Nutzer
Zitat:
DariusBrewka:
Ist OK hab's schon geschafft muss aboxstubs linken

Wird nicht automatisch damit gelinkt?
Zitat:
war halt nur komisch und wenn ich -D USE_INLINE_STDARG nutze geht's überhaupt nicht, dann kommen lauter Fehler (unterminated macro call).
Gar nicht komisch. Das ist für MUI und GCC normal... Das Problem ist ein Konflikt zwischen den MUI-Helpermakros (aus denen MUI-Aufrufe konstruiert werden) und den GCC-Inlines. Die MUI-Makros funktionieren für #pragmas wunderbar, aber nicht wenn die Funktion wie bei der GCC-Methode per #define "implementiert" wird.

[ Dieser Beitrag wurde von gni am 23.09.2005 um 12:10 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 12:11 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von DariusBrewka:
Ist OK hab's schon geschafft muss aboxstubs linken, war halt nur komisch und wenn ich -D USE_INLINE_STDARG nutze geht's überhaupt nicht, dann kommen lauter Fehler (unterminated macro call). So hat er aber Alles fehlerfrei übersetzt.

Normalerweise gibt's dann halt libmui.a, aber da es das auf MOS nicht gibt, habe ich halt gedacht ich müsste inlines nehmen. Dachte mir aber das MUI auf MOS zum System gehört und aus diesem Grund auch in einer systemlib integriert sein muss...

Danke an alle


Kein Thema :D

Zu dem "unterminated macro call": Da steckt dann wohl in irgendeinem inline-Include n toter Hund... mußt Dir mal das File anschauen, welches die erste Meldung erzeugt... oft fehlt da einfach nur ein #endif oder eine Klammer. Und eine Meldung dieser Art zieht reichlich davon nach sich I-)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 12:15 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von gni:
Zitat:
DariusBrewka:
Ist OK hab's schon geschafft muss aboxstubs linken

Wird nicht automatisch damit gelinkt?
Zitat:
war halt nur komisch und wenn ich -D USE_INLINE_STDARG nutze geht's überhaupt nicht, dann kommen lauter Fehler (unterminated macro call).
Gar nicht komisch. Das ist für MUI und GCC normal... Das Problem ist ein Konflikt zwischen den MUI-Helpermakros (aus denen MUI-Aufrufe konstruiert werden) und den GCC-Inlines. Die MUI-Makros funktionieren für #pragmas wunderbar, aber nicht wenn die Funktion wie bei der GCC-Methode per #define "implementiert" wird.

Wurde das nicht inzwischen "umgebaut"? Das Problem mit den Helper-Makros ist doch schon uralt und nicht nur auf den GCC bezogen, wenn ich mich recht erinnere... ist so lang her...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 17:49 Uhr

tokai
Posts: 1071
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von DariusBrewka:
irgendwie ist das mit den USE_INLINE_STDARG komisch, da die Funktion in clib deklariert wird wenn dieses MAkro nicht deiniert ist, sie wird aber nur Definiert wenn es das Makro gibt...


Für mich sieht das auf den ersten Blick korrekt aus. Wenn USE_INLINE_STDARG definiert ist, ist MUI_NewObject(...) ein Makro, wenn es nicht definiert ist, eine externe Funktion, die hinzugelinkt werden muß.


richtig.


Für MUI-Programme empfielt es sich auf USE_INLINE_STDARG zu verzichten und dafür -laboxstubs zu linken (muss man unter MorphOS SDK selbst nicht machen, da das dort schon über das SPEC file des Compilers gelöst ist.. kann natürlich bei einem Crosscompiler anders ausschauen).

regards,
tokai


--
http://www.christianrosentreter.com ~ MorphOS Software

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 17:51 Uhr

tokai
Posts: 1071
Nutzer
bah... nächstes mal lade ich die Seite erneut bevor ich antworte, sind ja schon alle Antworten da. :P

regards,
tokai
--
http://www.christianrosentreter.com ~ MorphOS Software

[ - Antworten - Zitieren - Direktlink - ]

23.09.2005, 21:36 Uhr

Georg
Posts: 107
Nutzer
Zitat:
Gar nicht komisch. Das ist für MUI und GCC normal... Das Problem ist ein Konflikt zwischen den MUI-Helpermakros (aus denen MUI-Aufrufe konstruiert werden) und den GCC-Inlines. Die MUI-Makros funktionieren für #pragmas wunderbar, aber nicht wenn die Funktion wie bei der GCC-Methode per #define "implementiert" wird.

So ganz optimal ist es nicht, aber man kann MUI auch mit inline stdarg verwenden, wenn man die kritischen Makros in libraries/mui.h so umbastelt:

#define MUIOBJMACRO_START(class) \
({ \
ClassID __class = class; \
enum { __ismuiobjmacro = 1 }; \
IPTR __tags[] = {0


#define OBJMACRO_END \
TAG_DONE}; \
( \
__ismuiobjmacro \
? MUI_NewObjectA((ClassID)__class, (struct TagItem *)(__tags + 1)) \
: NewObjectA((Class *)__class, NULL, (struct TagItem *)(__tags + 1)) \
); \
})

#define End OBJMACRO_END

#define MenustripObject MUIOBJMACRO_START(MUIC_Menustrip)
#define MenuObject MUIOBJMACRO_START(MUIC_Menu)
[...]


[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Morphos Includes Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]


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