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
