Re: glwDrawingAreaWidgetClass

Jon TURNEY <[email protected]>
Newsgroups gmane.os.cygwin.xfree
Message-ID <[email protected]>
On 13/10/2014 02:48, Chris Carlson wrote:
> I have a fairly large program that I developed on Fedora Linux.  It uses
> glwDrawingAreaClassRec to create a GL window.  I attempted to compile
> and run it on Cygwin, and I got the failure.
>
> I added a print statement just before calling XtCreateManagedWidget()
> and discovered the value was 0 on Cygwin and an address on Linux.  I
> presumed that meant there was an issue.
>
> To get around the problem, I downloaded the source from Mesa and
> compiled it myself.  The .a that was generated identifies the following
> (using nm):
>
> 0000000000000640 D glwDrawingAreaClassRec
> 0000000000000728 D glwDrawingAreaWidgetClass
>
> I then compared it to /lib/libGLw.dll.a and got this:
>
> nm /lib/libGLw.dll.a | grep DrawingAreaClass
> 0000000000000000 I __imp_glwMDrawingAreaClassRec
> 0000000000000000 I __nm_glwMDrawingAreaClassRec
> 0000000000000000 I __imp_glwDrawingAreaClassRec
> 0000000000000000 I __nm_glwDrawingAreaClassRec

Unfortunately, this isn't telling you anything useful as the __imp 
import symbols are fixed up at run-time.

> Now I tried compiling your test program and found that it did work as
> you showed, but I then added the include of GLwDrawA.h, and it fails.
> This doesn't make a whole lot of sense to me, and it doesn't seem right.

The issue is that without the extern, the declaration of 
glwDrawingAreaWidgetClass is also a 'tentative definition'

If there are no other references to symbols in libGLw, then that 
tentative definition (with a value of 0) will be used by ld as the 
definition.

(Linking with a shared library on linux is more relaxed)

> What do you think?  If I want to use the GLwDrawingAreaWidgetClass, I
> would presume that I should include the corresponding header file and
> the class would be defined.

On 07/10/2014 14:50, Jon TURNEY wrote:
> but this isn't testing correctly as glwDrawingAreaWidgetClass isn't marked as extern in GLwDrawA.h

Sorry, I should have said something like 'it's a bug that 
glwDrawingAreaWidgetClass isn't marked as extern in GLwDrawA.h'

So, something like the following attached patch to GLwDrawA.h is needed.

-- 
Jon TURNEY
Volunteer Cygwin/X X Server maintainer

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/
GLwDrawA.h.patch (text/plain, 629 B)
--- GLwDrawA.h.bak	2014-10-13 13:00:18.140625400 +0100
+++ GLwDrawA.h	2014-10-13 13:01:06.581762300 +0100
@@ -136,7 +136,7 @@
 typedef struct _GLwMDrawingAreaClassRec	*GLwMDrawingAreaWidgetClass;
 typedef struct _GLwMDrawingAreaRec	*GLwMDrawingAreaWidget;
 
-GLAPI WidgetClass glwMDrawingAreaWidgetClass;
+extern GLAPI WidgetClass glwMDrawingAreaWidgetClass;
 
 
 #else
@@ -144,7 +144,7 @@
 typedef struct _GLwDrawingAreaClassRec	*GLwDrawingAreaWidgetClass;
 typedef struct _GLwDrawingAreaRec	*GLwDrawingAreaWidget;
 
-GLAPI WidgetClass glwDrawingAreaWidgetClass;
+extern GLAPI WidgetClass glwDrawingAreaWidgetClass;
 
 
 #endif
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.