Hi Mathias,
Le 8 janv. 2014 à 00:11, Mathias Bauer a écrit :
Hi,
I've set up a build environment with the lastest trunk versions of GNUstep,
clang and libobjc2 on Ubuntu 12.04.
In my program (compiled with ARC) I tried to dispatch a block with
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^ ...
This crashes immediately when the dispatch_get_global_queue call returns. The stack shows
that the compiler executes a "retain" call on the returned object, but
libdispatch does not seem to be compiled with objc support at all, so I assume that the
returned object just is a c struct.
It seems libdispatch ObjC integration is not compatible with libobjc2 as it is.
When compiling code that uses libdispatch, I pass -DOS_OBJECT_USE_OBJC=0 to
the CPPFLAGS, in order to disable the libdispatch ObjC integration.
See http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues
I used
./configure --enable-debug-by-default --enable-objc-nonfragile-abi
--with-layout=gnustep
for the GNUstep make build and
./configure --disable-mixedabi
for building GNUstep base.
For libdispatch I used the configure provided by the repository at
https://github.com/nickhutchinson/libdispatch.git
I assume that the culprit is in the libdispatch build. I manually patched the
generated config.h file to support OBJC, but this obviously isn't enough.
Based on my experience, this repository requires various changes to compile and
work correctly on GNUstep. Some GNUstep people have submitted changes but they
haven't been accepted yet.
I maintain a fork of this repository patched with GNUstep+libobjc2 support
here: http://svn.gna.org/viewcvs/etoile/trunk/Dependencies/libdispatch-objc2/
The changes I did are listed in this patch:
http://svn.gna.org/viewcvs/etoile?view=revision&revision=9796
The main change is rewriting FindCBlocks.cmake to pick either libBlocksRuntime
or libobjc2, depending on what is available on the host system.
For the install instructions, see:
http://svn.gna.org/viewcvs/*checkout*/etoile/trunk/Dependencies/libdispatch-objc2/INSTALL
Another major problem that remains unsovled lies the fact that GNUstep Base
doesn't attempt to detect libdispatch, and compile NSOperation and
NSOperationQueue with libdispatch support enabled. As a result, you have to
stick to the libdispatch C API.
Cheers,
Quentin.