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

amiga-news.de Forum > Programmierung > c++ Probleme clib/alib_protos.h [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

22.03.2006, 20:29 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Hi,

ich habe folgendes Problem:
Ich möchte ein Aros C++ Programm entwickeln, leider bekomme ich vom Aros g++ folgende Fehlermeldung, wenn ich <clib/alib_protos.h> includire:

code:
Compiler: i686-aros
Building Makefile: "C:CrossCompilerAmiDevCppAROS_CNCMakefile.win"
Executing  make clean
rm -f main.o cnc.o serial.o  Aros_CNC.exe

i686-aros-g++.exe -c main.cpp -o main.o -I"C:/CrossCompiler/AmiDevCpp/usr/local/amiga/lib/gcc-lib/i686-aros/3.3.1"  -I"C:/CrossCompiler/AmiDevCpp/usr/local/amiga/i686-aros/sys-include"   

In file included from /usr/local/amiga/i686-aros/sys-include/rexx/storage.h:19,
                 from /usr/local/amiga/i686-aros/sys-include/clib/alib_protos.h:46,
                 from main.cpp:14:
/usr/local/amiga/i686-aros/sys-include/dos/dosextens.h:436: error: member '
   DosList::<anonymous union>::<anonymous struct> DosList::<anonymous 
   union>::dol_volume' with constructor not allowed in union
In file included from main.cpp:14:
/usr/local/amiga/i686-aros/sys-include/clib/intuition_protos.h:136: error: previous
   declaration of 'IPTR CallHookA(Hook*, void*, void*)' with C++ linkage
/usr/local/amiga/i686-aros/sys-include/clib/alib_protos.h:59: error: conflicts 
   with new declaration with C linkage
/usr/local/amiga/i686-aros/sys-include/clib/intuition_protos.h:137: error: previous
   declaration of 'IPTR CallHook(Hook*, void*, ...)' with C++ linkage
/usr/local/amiga/i686-aros/sys-include/clib/alib_protos.h:60: error: conflicts 
   with new declaration with C linkage
make.exe: *** [main.o] Error 1

Execution terminated



Ich habe es auch mit <proto/alib.h> probiert, dabei kommt das hier heraus:

code:
Compiler: i686-aros
Building Makefile: "C:CrossCompilerAmiDevCppAROS_CNCMakefile.win"
Executing  make clean
rm -f main.o cnc.o serial.o  Aros_CNC.exe

i686-aros-g++.exe -c main.cpp -o main.o -I"C:/CrossCompiler/AmiDevCpp/usr/local/amiga/lib/gcc-lib/i686-aros/3.3.1"  -I"C:/CrossCompiler/AmiDevCpp/usr/local/amiga/i686-aros/sys-include"   

In file included from /usr/local/amiga/i686-aros/sys-include/rexx/storage.h:19,
                 from /usr/local/amiga/i686-aros/sys-include/clib/alib_protos.h:46,
                 from /usr/local/amiga/i686-aros/sys-include/proto/alib.h:13,
                 from main.cpp:14:
/usr/local/amiga/i686-aros/sys-include/dos/dosextens.h:436: error: member '
   DosList::<anonymous union>::<anonymous struct> DosList::<anonymous 
   union>::dol_volume' with constructor not allowed in union
In file included from /usr/local/amiga/i686-aros/sys-include/proto/alib.h:13,
                 from main.cpp:14:
/usr/local/amiga/i686-aros/sys-include/clib/intuition_protos.h:136: error: previous
   declaration of 'IPTR CallHookA(Hook*, void*, void*)' with C++ linkage
/usr/local/amiga/i686-aros/sys-include/clib/alib_protos.h:59: error: conflicts 
   with new declaration with C linkage
/usr/local/amiga/i686-aros/sys-include/clib/intuition_protos.h:137: error: previous
   declaration of 'IPTR CallHook(Hook*, void*, ...)' with C++ linkage
/usr/local/amiga/i686-aros/sys-include/clib/alib_protos.h:60: error: conflicts 
   with new declaration with C linkage
make.exe: *** [main.o] Error 1

Execution terminated


Muss ich da vielleicht irgendein #define setzen, wenn ich mit c++ programmiere ?

--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

23.03.2006, 00:56 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Das selbe will ich gerade auch machen, leider scheint das Alles nicht so einfach zu gehen, bzw. insbesondere gibt's fast immer Probleme mit IPTR, da konnte ich nur einen Ausweg finden indem ich die Includes mittels #ifdef abgeändert habe, die Speziell für den C++ Fall gültig sind.

Meistens muss man IPTR durch APTR ersetzen dann ging das, z.B. bei dol_volume in dos/dosextens.h, warum mit IPTR der Fehler auftritt kann ich mir nicht erklären.

ansonsten solltest du ggf. noch -fpermissive als compileroption hinzufügen.

Da IPTR ehe nur bei 64 Bit Adressen gültig ist und AROS wie auf aros-exec (habe das dort auch angesprochen) ehe nicht 64BIT safe ist, ist es nicht wirklich ein Problem IPTR durch APTR zu ersetzen.

Das mirt dem CallHook(), das kommt bei mir allerdings nicht, aber ich habe wohl andere C++ Schwierigkeiten, da kann er z.B. die

MUI_NewObject(), MUI_Request() und MUI_MakeObject() Funktionen nicht finden (bei C++), obwohl ich -lmui benutze, wenn ich MUIMASTER_YES_INLINE_STDARG definiere, dann kann ich die MUI Makros nicht nutzen, ferner sagt er irgendwas von irgendwelchen pthread_xyz Funktionen die er nicht finden kann, weiß aber garnicht wozu die da sind . Bzw. kann man die irgendwie abschalten?, die brauche ich nicht.

[ - Antworten - Zitieren - Direktlink - ]

23.03.2006, 19:52 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@DariusBrewka:

Mit hilfe deiner Tips in der email (IPTR <-> APTR und extern"C") konnte ich das Testprogramm mit #include <alib_protos.h> kompilieren.

Jetzt habe ich mal versucht was mit ZUNE (mui) zu machen und bekomme ich bei diesem code:
C++ code:
#include <cstdlib>
#include <iostream>

     #include <exec/types.h>
     
     #include <libraries/mui.h>
     
     #include <proto/exec.h>
     
     #include <proto/intuition.h>
     
     #include <proto/muimaster.h>
     
   
   
    #include <clib/alib_protos.h>
    
    
     #include "cnc.h"
     
     
    /* 
     int main()
     {
         CNC cnc1;
         return 10;
                  
         }
     
     */
     
     
     
     int main(void)
     {
         Object *wnd, *app, *but;
     
         // GUI creation
         app = ApplicationObject,
             SubWindow, wnd = WindowObject,
                 MUIA_Window_Title, "AROS CNC",
                 WindowContents, VGroup,
                     Child, TextObject,
                         MUIA_Text_Contents, "33cHello world!nHow are you?",
                         End,
                     Child, but = SimpleButton("_Ok"),
                     End,
                 End,
             End;
     
         if (app != NULL)
         {
             ULONG sigs = 0;
     
             // Click Close gadget or hit Escape to quit
             DoMethod(wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
                      (IPTR)app, 2,
                      MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
     
             // Click the button to quit
             DoMethod(but, MUIM_Notify, MUIA_Pressed, FALSE,
                      (IPTR)app, 2,
                      MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
     
             // Open the window
             set(wnd, MUIA_Window_Open, TRUE);
     
             // Check that the window opened
             if (XGET(wnd, MUIA_Window_Open))
             {
                 // Main loop
                 while((LONG)DoMethod(app, MUIM_Application_NewInput, (IPTR)&sigs)
                       != MUIV_Application_ReturnID_Quit)
                 {
                     if (sigs)
                     {
                         sigs = Wait(sigs | SIGBREAKF_CTRL_C);
                         if (sigs & SIGBREAKF_CTRL_C)
                             break;
                     }
                 }
             }
             // Destroy our application and all its objects
             MUI_DisposeObject(app);
         }
         
         return 0;
     }


bekomme ich folgende Fehler:

code:
Compiler: i686-aros
Building Makefile: "C:CrossCompilerAmiDevCppAROS_CNCMakefile.win"
Executing  make clean
rm -f main.o cnc.o serial.o  Aros_CNC.exe

i686-aros-g++.exe -c main.cpp -o main.o -I"C:/CrossCompiler/AmiDevCpp/usr/local/amiga/lib/gcc-lib/i686-aros/3.3.1"  -I"C:/CrossCompiler/AmiDevCpp/usr/local/amiga/i686-aros/sys-include"   

main.cpp: In function 'int main()':
main.cpp:49: warning: cannot pass objects of non-POD type 'class IPTR' through 
   '...'; call will abort at runtime
main.cpp:61: error: non-lvalue in unary '&'
main.cpp:66: error: non-lvalue in unary '&'
main.cpp:72: error: non-lvalue in unary '&'
main.cpp:72: error: could not convert '({...})' to 'bool'
main.cpp:75: error: non-lvalue in unary '&'
main.cpp:76: error: non-lvalue in unary '&'
main.cpp:76: error: 'class IPTR' used where a 'LONG' was expected
make.exe: *** [main.o] Error 1

Execution terminated


Hast ja oben schon geschrieben, daß Zune Probleme macht.
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

23.03.2006, 21:41 Uhr

Georg
Posts: 107
Nutzer
Ich bin kein C++ Coder, aber versucht mal exec/types.h zu editieren. Darin sind die typedefs für IPTR, SIPTR und STACKIPTR innerhalb eines
"#if !defined(__cplusplus)" Blockes. Ich würde das mal probeweise umändern in "#if 1".


[ - Antworten - Zitieren - Direktlink - ]

24.03.2006, 02:24 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Georg:
Ich bin kein C++ Coder, aber versucht mal exec/types.h zu editieren. Darin sind die typedefs für IPTR, SIPTR und STACKIPTR innerhalb eines
"#if !defined(__cplusplus)" Blockes. Ich würde das mal probeweise umändern in "#if 1".


Ich habe es zwar geschafft das obige Programm zu übersetzen, aber leider nicht indem ich einfach nur types.h geändert habe. Es ist unter C++ immer irgendwie ein Konflikt wenn IPTR benutzt wird. Und ich muss boobsistubs.h nutzen.

Leider geht bei mir das Linken nicht, da kommen undefinierte Symbole

code:
U dl_iterate_phdr
U _GLOBAL_OFFSET_TABLE_
w pthread_create
w pthread_getspecific
w pthread_key_create
w pthread_mutex_lock
w pthread_mutex_unlock
w pthread_once
w pthread_setspecific
U MUI_Request(void*, void*, long, char*, char*, char*, void
U MUI_MakeObject(long, ...)
U MUI_AllocAslRequestTags(unsigned long, unsigned long, ...)


die MUI_xyz()s, da weiß ich nicht warum das überhaupt kommt, denn ich rufe g++ mit -lmui auf, die Restlichen Symbole werden wohl daran liegen das AROS Hosted den Linux Compiler nutzt und ich statt gcc g++ nutze und da wohl die restlichen Funktionen gelinkt werden. Aber wie kann ich das abschalten?



[ - Antworten - Zitieren - Direktlink - ]

24.03.2006, 09:26 Uhr

Solar
Posts: 3680
Nutzer
Ich hab zwar von MUI / AOS API keinen Plan, aber vielleicht...

Zitat:
Original von DariusBrewka:

Die MUI_xyz()s, da weiß ich nicht warum das überhaupt kommt, denn ich rufe g++ mit -lmui auf...


Versuchsweise mal mit G++ -c nur bis zum Objektcode linken lassen, und mit objdump die Symboltabellen des Objektcodes und von libmui ausgeben lassen. Eventuell sucht G++ nach "mangled names", weil die Funktionen nicht als extern "C" deklariert wurden o.ä.

Zitat:
...die Restlichen Symbole werden wohl daran liegen das AROS Hosted den Linux Compiler nutzt und ich statt gcc g++ nutze und da wohl die restlichen Funktionen gelinkt werden.

pthread wird nicht automatisch durch den G++ angezogen; da hätte ich eher einen der Includes in Verdacht.

Zitat:
Aber wie kann ich das abschalten?

Erst, wenn Du raushast, woran es genau liegt.



[ Dieser Beitrag wurde von Solar am 24.03.2006 um 09:27 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.03.2006, 16:12 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
die MUI_xyz()s, da weiß ich nicht warum das überhaupt kommt, denn ich rufe g++ mit -lmui auf, ...

Das sind interessanterweise genau die varargs-Funktionen. Ich weiß nicht, wie AROS das handhabt, aber die 68k-includes pflegten genau damit *sehr häßliche* Dinge zu tun, die sowohl wegen C++, als auch dem anderen Prozessor ziemlich problematisch sein können.
Ich nehme mal an, daß in der Linkbibliothek nur die xyzA() Funktionen sind.

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

[ - Antworten - Zitieren - Direktlink - ]

26.03.2006, 21:02 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Zitat:
Original von Georg:
Ich bin kein C++ Coder, aber versucht mal exec/types.h zu editieren. Darin sind die typedefs für IPTR, SIPTR und STACKIPTR innerhalb eines
"#if !defined(__cplusplus)" Blockes. Ich würde das mal probeweise umändern in "#if 1".


Danke !
Das war der entscheidende Hinweis.
Danach bekam ich zwar immer noch diverse Fehlermeldungen und Warnungen, aber die konnte ich durch casten alle beseitigen. (die
(long unsigned int) casts)
C++ code:
#include <cstdlib>
#include <iostream>

#ifdef __AROS__
#include <clib/boopsistubs.h>
#endif

#include <exec/types.h>
     
#include <libraries/mui.h>
     
#include <proto/exec.h>
     
#include <proto/intuition.h>
     
#include <proto/muimaster.h>


#include "cnc.h"
     
     
   
     
     
     
     int main(void)
{
    Object *wnd, *app, *but;
    CNC cnc1; 
    
         // GUI creation
    app = ApplicationObject,
    SubWindow, wnd = WindowObject,
    MUIA_Window_Title, "AROS CNC",
    WindowContents, VGroup,
    Child, TextObject,
    MUIA_Text_Contents, "33cHello world!nHow are you?",
    End,
    Child, but = SimpleButton("_Ok"),
    End,
    End,
    End;
     
    if (app != NULL)
    {
        ULONG sigs = 0;
     
             // Click Close gadget or hit Escape to quit
        DoMethod(wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
                 (IPTR)app, 2,
                 MUIM_Application_ReturnID, 
                 (long unsigned int)MUIV_Application_ReturnID_Quit);
     
             // Click the button to quit
        DoMethod(but, MUIM_Notify, MUIA_Pressed, FALSE,
                 (IPTR)app, 2,
                 MUIM_Application_ReturnID, 
                 (long unsigned int)MUIV_Application_ReturnID_Quit);
     
             // Open the window
        set(wnd, MUIA_Window_Open, TRUE);
     
             // Check that the window opened
        if (XGET(wnd, MUIA_Window_Open))
        {
                 // Main loop
            DoMethod(app, MUIM_Application_NewInput, (long unsigned int)&sigs);
            while(DoMethod(app, MUIM_Application_NewInput, (ULONG) sigs) != (long unsigned int)APTR(MUIV_Application_ReturnID_Quit))
            {
                if (sigs)
                {
                    sigs = Wait(sigs | SIGBREAKF_CTRL_C);
                    if (sigs & SIGBREAKF_CTRL_C)
                        break;
                }
            }
        }
             // Destroy our application and all its objects
        MUI_DisposeObject(app);
    }
         
    return 0;
}


Jetzt muss ich mich mit ZUNE/MUI beschäftigen.
Kennt da vielleicht jemand ein paar gute Links, Tutorials ?
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

26.03.2006, 21:58 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Kann man mit ZUNE/MUI eigentlich Tabs machen ?
Also über Registerkarten zwischen verschiedenen Seiten umschalten ?
Falls ja, wie heißt das in MUI und wie mache ich das ?
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

26.03.2006, 22:47 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Ich habe ein bisschen Dokumentation zu MUI gefunden und das mit den Tabs hinbekommen.

Werden aber sicher noch ein paar Fragen kommen...
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

28.03.2006, 02:01 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Solar:
Versuchsweise mal mit G++ -c nur bis zum Objektcode linken lassen, und mit objdump die Symboltabellen des Objektcodes und von libmui ausgeben lassen. Eventuell sucht G++ nach "mangled names", weil die Funktionen nicht als extern "C" deklariert wurden o.ä.


Danke, ich habe erstens einen anderen Compiler benutzt und dann die definitionen in clib/muimaster_protos.h als extern "C" deklariert, damit habe ich die ganzen link Probleme behoben.

gruss


[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > c++ Probleme clib/alib_protos.h [ - Suche - Neue Beiträge - Registrieren - Login - ]


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