Matthew Kille wrote:
> Hi All,
>
> I'm trying to build a GAPI application using cegcc. As there doesn't
> seem to be a import library ready made for this, I have attempting to
> make one, but without much success.
>
> My gx.def file looks like this:
>
> LIBRARY GX
> EXPORTS
> GXOpenDisplay
> GXCloseDisplay
> GXBeginDraw
> GXEndDraw
> GXOpenInput
> GXCloseInput
> GXGetDisplayProperties
> GXGetDefaultKeys
> GXSuspend
> GXResume
> GXSetViewport
> GXIsDisplayDRAMBuffer
>
> And I'm using dlltool like this:
>
> $ arm-wince-cegcc-dlltool -d gx.def -l libgx.a
> $ cp libgx.a /opt/cegcc/arm-wince-cegcc/lib
>
> My test program then simply looks like this:
>
> #include <windows.h>
> #include <gx.h>
>
> int WINAPI WinMain (HINSTANCE hInstance,
> HINSTANCE hPrevInstance,
> LPWSTR szCmdLine,
> int iCmdShow)
> {
> MessageBox (NULL, TEXT("Hello"), TEXT("Hello Demo"), MB_OK);
> GXBeginDraw();
> return (0);
> }
>
> I compile it like this:
>
> arm-wince-cegcc-g++ -Wall -D_WIN32_WCE=0x0420 -D_WIN32_IE=0x0400 -o
> test.exe test.c -lgx
>
> But the resulting compiler output is this:
>
> Info: resolving _CRT_MT by linking to __imp__CRT_MT
> (auto-import/blah/Temp/cc9E2Xnc.o:test.c:(.text+0x34): undefined
> reference to `GXBeginDraw()'
> collect2: ld returned 1 exit status
> )
>
> I suspected some kind of name mangling might be the cause, but whatever
> I have tried gives me the same result as above.
>
> Where am I going wrong? Or am I barking up completely the wrong tree? :)
>
> Hope someone can help.
>
Yep, name mangling is the problem. You are using the c++ compiler (g++),
and your gx.h header,
which you didn't show, isn't declaring GXBeginDraw with "C" linkage. C++
uses a different mangling
scheme to support overloading, namespaces and classes,
so the linker is really looking for a function named _Z11GXBeginDrawv.
Declaring GXBeginDraw like ...:
extern "C" void GXBeginDraw (void);
... fixes it, or using gcc instead of g++ also fixes it.
The correct fix is to wrap your header with ' extern "C" ' ... :
#ifndef _GX_H
#define _GX_H
#ifdef __cplusplus
extern "C"
{
#endif
<rest of header here>
#ifdef __cplusplus
}
#endif
#endif
(Take a look at the other headers in src/w32api/include in the sources,
or in /opt/cegcc/arm-wince-cegcc/include in the binary releases to get a
grasp.)
... and then you can use gcc or g++.
Once you get this into a working state, don't be shy and send us the def
file and the header for inclusion in
future CeGCC releases. Thanks!
Cheers,
Pedro Alves
P.S.: Be sure to send us MSDN pointers describing the interfaces too.
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Cegcc-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cegcc-devel