Delphi XE6链接C代码在iOS中

前端之家收集整理的这篇文章主要介绍了Delphi XE6链接C代码在iOS中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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函数是一个只调用非静态实现函数的包装器。

原文链接:https://www.f2er.com/delphi/103870.html

猜你在找的Delphi相关文章