I just look for symbols with have "::" in the name (such as
std::basic_string<char,
std::char_traits<char>, std::allocator<char> >::~basic_string()) and know
that those are C++ symbols :-)

Always settings IsCxx might work, but may bring in more stuff than using
the C linker would and might also be slower. I'm not really sure to be
honest.

Jeff

On Mon, Apr 16, 2012 at 9:26 PM, Dermot O Sullivan <[email protected]> wrote:

> Sir, you are a legend. All working now. Thanks for your help! Out of
> interest, when would you know when to use IsCxx? Does it cause any harm to
> use it if the original library wasn't c++ or if I didnt know what it was
> written in?
> Eitherway I will post the binding project to my github 
> github.com/dermotoslater today or tomorrow for anyone else who comes across 
> this.
>
>
> On Tue, Apr 17, 2012 at 5:50 AM, Jeff Stedfast <[email protected]> wrote:
>
>> Hi Dermot,
>>
>> From the build log, it looks like the symbols it couldn't find originally
>> were c++ symbols.
>>
>> Try:
>>
>> [assembly: LinkWith ("libBump.a", LinkTarget.ArmV7 | LinkTarget.ArmV6 |
>> LinkTarget.Simulator, ForceLoad = true, Frameworks = "CFNetwork
>> CoreLocation AudioToolbox", IsCxx = true)]
>>
>> Does that help at all?
>>
>> Jeff
>>
>>
>> On Mon, Apr 16, 2012 at 6:28 AM, Dermot O Sullivan <[email protected]>wrote:
>>
>>> Hi Jeff,
>>>
>>> I really appreciate you taking the time to clarify that. I think im
>>> almost there, but still cant quite get it to work.
>>> I have bound the blocks as you described (see the ApiDefinition.cs file
>>> contents below).
>>>
>>> When I build this project as is, I get  Bump3Binding.dll file that is
>>> 23.1MB. So far so good.
>>> I attempt to use this in my project, everything I need seems to be
>>> coming up in intellisense, but when I build, I get an error stating:
>>>
>>> *ld: symbol(s) not found for architecture i386*
>>> *collect2: ld returned 1 exit status*
>>> *
>>> *
>>> *mtouch exited with code 1*
>>> *
>>> *
>>> *(full build output available here: http://pastebin.com/Hj2DZt0L )*
>>> *
>>> *
>>> I imagine this is something to do with the building of the actual
>>> library, or more specifically, the linking with its required libraries,
>>> which are described in the bump api documentation like so:
>>>
>>> *Ensure that your target is linked against libBump.a,
>>> CFNetwork.framework, CoreLocation.framework, and AudioToolbox.framework.
>>> *
>>> *
>>> *
>>> So if I go back to my Binding project and change the linkswith.cs file
>>> from:
>>>
>>> [assembly: LinkWith ("libBump.a", LinkTarget.ArmV7 | LinkTarget.ArmV6 |
>>> LinkTarget.Simulator, ForceLoad = true )]
>>>
>>> to
>>>
>>> [assembly: LinkWith ("libBump.a", LinkTarget.ArmV7 | LinkTarget.ArmV6 |
>>> LinkTarget.Simulator, ForceLoad = true, Frameworks = "CFNetwork
>>> CoreLocation AudioToolbox" )]
>>>
>>>
>>> then I get "Build Successful" but the dll is only 3.0KB and isn't a
>>> valid dll file.
>>>
>>>
>>> Any tips on where I might be going wrong?
>>>
>>>
>>>
>>>
>>> ApiDefinition.cs file: (full file available here:
>>> http://pastebin.com/bFh3csSf )
>>>
>>> namespace Bump3Binding
>>> {
>>>
>>> delegate void BumpEventBlock(BumpEvent evt);
>>> delegate void BumpMatchBlock(ulong proposedChannelID);
>>> .
>>> .
>>> .
>>>
>>> [BaseType (typeof (NSObject))]
>>> interface BumpClient{
>>>
>>> [Export("BumpEventBlock:")]
>>> void BumpEvent(BumpEventBlock evt);
>>>
>>> [Export("BumpEventBlock:")]
>>> void BumpMatchBlock(ulong proposedChannelID);
>>> .
>>> .
>>> .
>>>
>>>
>>> }
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Sat, Apr 14, 2012 at 12:45 AM, Jeff Stedfast <[email protected]>wrote:
>>>
>>>> Hi Dermot,
>>>>
>>>> Let me try to better explain how blocks are bound...
>>>>
>>>> On Thu, Apr 12, 2012 at 10:22 PM, dermotos <[email protected]> wrote:
>>>>
>>>>> Im trying to bind the latest version of the bump api (version 3).
>>>>> This version uses blocks as callbacks when events occur.
>>>>>
>>>>> The header file, located here:
>>>>>
>>>>> https://github.com/bumptech/bump-api-ios/blob/master/libBump/BumpClient.h
>>>>> defines the blocks like this:
>>>>>
>>>>> /* called after a Bump or No Match is detected. */
>>>>> typedef void (^BumpEventBlock)(bump_event event);
>>>>>
>>>>> /* called after a Match has occurred. */
>>>>> typedef void (^BumpMatchBlock)(BumpChannelID proposedChannelID);
>>>>>
>>>>> /* called after both parties to a Match have confirmed the proposed
>>>>> Channel
>>>>> */
>>>>> typedef void (^BumpChannelConfirmedBlock)(BumpChannelID channelID);
>>>>>
>>>>> How do I bind these?
>>>>>
>>>>> The documentation on this describes how to bind a block like this:
>>>>>
>>>>> - (void) enumerateObjectsUsingBlock:(void (^)(id obj, BOOL *stop) block
>>>>>
>>>>
>>>>
>>>> Think of the above as a method definition (named
>>>> enumerateObjectsUsingBlock) that takes as a parameter an anonymous 
>>>> delegate.
>>>>
>>>> Anonymous "Block" syntax is: <return-type> (^) (<parameter-list>)
>>>> <callback-name>
>>>>
>>>> In this case "block" is the callback-name token. This is just the
>>>> variable name of the delegate.
>>>>
>>>>
>>>>
>>>>>
>>>>> like this:
>>>>>
>>>>> // This declares the callback signature for the block:
>>>>> delegate void NSSetEnumerator (NSObject obj, ref bool stop)
>>>>>
>>>>
>>>> What the author of the documentation did here was to separate the block
>>>> from the method definition so that he could name it.
>>>>
>>>> The above C# delegate maps to: void (^) (id obj, bool *stop);
>>>>
>>>>
>>>>>
>>>>> // Later, inside your definition, do this:
>>>>> [Export ("enumerateObjectUsingBlock:")]
>>>>> void Enumerate (NSSetEnumerator enum)
>>>>
>>>>
>>>>> I cant really follow this for the bump binding.
>>>>> Does typedef affect how I bind this?
>>>>> Do I need to somehow declare BumpChannelConfirmedBlock as a type? how
>>>>> about
>>>>> BumpChannelID?
>>>>>
>>>>
>>>> BumpChannelIID is defined as: typedef unsigned long long BumpChannelID;
>>>>
>>>> In C#, this would be UInt64 or ulong.
>>>>
>>>>  So, if we are to bind the following ObjC blocks;
>>>>
>>>> /* called after a Bump or No Match is detected. */
>>>> typedef void (^BumpEventBlock)(bump_event event);
>>>>
>>>> /* called after a Match has occurred. */
>>>> typedef void (^BumpMatchBlock)(BumpChannelID proposedChannelID);
>>>>
>>>> /* called after both parties to a Match have confirmed the proposed
>>>> Channel
>>>> */
>>>> typedef void (^BumpChannelConfirmedBlock)(BumpChannelID channelID);
>>>>
>>>>
>>>> This is what they would look like in C#:
>>>>
>>>> delegate void BumpEventBlock (bump_event event);
>>>> delegate void BumpMatchBlock (ulong proposedChannelID);
>>>> delegate void BumpChannelConfirmedBlock (ulong channelID);
>>>>
>>>>
>>>> How do I know to bind them like this? Well, here's what *I* do:
>>>>
>>>> I look at the ObjC definition:
>>>>
>>>> typedef void (^BumpMatchBlock) (BumpChannelID proposedChannelID);
>>>>
>>>> In ObjC, like C and even C#, all typedef does is alias a type. Function
>>>> pointers in C and Blocks in ObjC need to be typedef'd if you are going to
>>>> use them like "named delegates" (as opposed to anonymous delegates).
>>>>
>>>> So, our revised syntax for named blocks is this:
>>>>
>>>> typedef <return-type> (^<delegate-name>) (<parameter-list>);
>>>>
>>>> Pretty straight forward now, right?
>>>>
>>>> Now it's easy to just do substitution and we get:
>>>>
>>>> delegate void BumpMatchBlock (BumpChannelID proposedChannelId);
>>>>
>>>> Since BumpChannelID maps to a ulong in C#, we can do that substitution
>>>> and we end up with:
>>>>
>>>> delegate void BumpMatchBlock (ulong proposedChannelID);
>>>>
>>>>
>>>> Hope that helps clear things up,
>>>>
>>>> Jeff
>>>>
>>>>
>>>
>>
>
_______________________________________________
MonoTouch mailing list
[email protected]
http://lists.ximian.com/mailman/listinfo/monotouch

Reply via email to