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


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