Delphi XE6链接C代码在iOS中
发布时间:2020-12-15 05:26:03 所属栏目:大数据 来源:网络整理
导读:我在Android上使用Delphi XE6需要C代码构建了一个应用程序。但是在iOS上我不能使它工作。我怀疑问题是与手臂/拇指状态有关,但我不知道。在任何一个系统中都没有问题从Pascal调用C代码。但是如果C代码调用一个Pascal过程,iOS生成一个“坏的系统调用(12)”
我在Android上使用Delphi XE6需要C代码构建了一个应用程序。但是在iOS上我不能使它工作。我怀疑问题是与手臂/拇指状态有关,但我不知道。在任何一个系统中都没有问题从Pascal调用C代码。但是如果C代码调用一个Pascal过程,iOS生成一个“坏的系统调用(12)”
这里是pascal代码: function testarm(a,b:integer):integer; cdecl; external "testC.o"; Procedure testC; Begin testarm(1,2); end; function BackToPascal(a,b:integer): integer; cdecl; Begin result := a+b; end; ...... exports BackToPascal; 这里是C代码: extern int BackToPascal(int a,int b); extern int testarm(int a,int b) { int i; i = BackToPascal(a,b); return i+1; } 在android这是我如何编译(它是工作): ..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8 在ios: xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp 我怀疑我的xcode设置是错误的,但我不知道为什么。 当我调试,当调用BackToPascal(在“bl 0x8b8390 Xgobj.BackToPascal(int,int)”)时调用testC“test错误。在Android它的工作完美,但“bl”不直接调用“BackToPascal”,而是下面的代码: 75A82D94 12C68FE2 add r12,pc,#18874368 ; 0x1200000 75A82D98 73CA8CE2 add r12,r12,#471040 ; 0x73000 75A82D9C 40F2BCE5 ldr pc,[r12,#576]! ; 0x240 其中进入BackToPascal 解决方法
代码看起来不错,你的调用约定处理是,我的眼睛,完全正确。
我认为你可能已经遇到一个可能的/传言的bug在苹果的ARM铛,其中调用静态函数(这可能发生在幕后,例如类型转换)从静态函数可能会导致堆栈损坏。你不是直接这样做,但extern函数可以通过一个stub来实现,它调用包含实现的匿名静态函数。 你可以尝试让你的extern函数是一个只调用非静态实现函数的包装器。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |