回覆: 'glib/gio/glocalfile.c' no longer compiles with MSVC



Hello John,

The case in gdir.c is that it includes the dirent.h and wdirent.c to provide for MSVC builds, which was also what my initial patch tried to do.

Hope this explains it a bit.

With blessings.

寄件者: John Emmas
寄件日期: 2013/9/12 17:17
收件者: gtk-devel-list gnome org
副本: gtk-devel-list
主旨: Re: 'glib/gio/glocalfile.c' no longer compiles with MSVC

On 11/09/2013 23:16, A. Walton wrote:
>
> The best way to get this reviewed is to get on IRC, get the attention
of one of the GLib
> maintainers, and have them review the code. Ryan Lortie (desrt on
IRC) wrote that code,
> so he's probably the first person to run this change by.
>


On 11/09/2013 22:27, Fan Chun-wei wrote:
>
> It is indeed a very recent update to glocalfile.c, due to the use of
dirent. I have opened
> a bug for it few days ago at
https://bugzilla.gnome.org/show_bug.cgi?id=707787, so
> if someone can take a look at it as a stable release is around the
corner it would be great.
>

Thanks guys,

Before I add anything to Fan's bug report (and before visiting IRC) let
me just create a record here of what I've found this morning - because
it's definitely a bit baffling and I think it needs some lengthy
consideration....

The actual problem is a simple one.  the sources for opendir() /
readdir() etc can be found in '<glib>/build/win32/dirent/dirent.c'.  But
that source file is not included in any of the MSVC projects so when you
try to call one of those functions you end up with a missing symbol. 
That's what's happening in Ryan's latest changes to 'gio'glocalfile.c' -
but it's not quite that simple....

opendir() / readdir() etc are already getting called all over the place
- so how has this been working up until now???  There are two explanations:-

1)  Some of the files which use opendir() have a complementary Windows
version which doesn't use it.  For example 'glib/gspawn.c' has a
complmentary file 'glib/gspawn-win32.c' which doesn't use those
functions.  Likewise, 'gio/gcontentype.c' has a complmentary file
'gio/gcontenttype-win32.c'.  So that's half the explanation.

2) There are some other files which use opendir() etc (e.g.
'glib/gdir.c') but there's no complementary gdir-win32.c.  So how does
it work?  Here's an example, using 'closedir()'

       #ifdef G_OS_WIN32
             _wclosedir (whatever);
       #else
             closedir(whatever);
       #endif

So you can see that for Windows, 'closedir()' isn't getting called.
Instead, we're calling '_wclosedir()'.

But here's the problem...  _wclosedir() is also implemented in dirent.c
(the file that we forgot to include in our MSVC projects). So if the
compiler complains about not being able to find closedir() why does it
not complain when it can't find _wclosedir()???

_wclosedir() / _wopendir() / _wreaddir() etc must be getting picked up
from somewhere else on my system but for the life of me I can't see
anywhere else where they'd be getting picked up.

In any event, adding dirent.c to my glib project doesn't help much. It's
symbols aren't exported so if you build glib as a Windows DLL, the built
DLL doesn't export any of those functions so they can't be called as
they are at present (from gio, for example).

This probably needs a bit of in-depth thought but I agree with Fan. It
needs to be fixed with some urgency!!  Depending on time zones I'd be
happy to collaborate on IRC and I could help with testing if necessary.

John
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-devel-list


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]