静态库打破构建

时间:2011-08-16 17:07:46

标签: xcode mono xamarin.ios pinvoke static-libraries

我已经在xcode中编译了一个静态库,目标是“iOS设备”,并将其链接到一个monotouch应用程序。当我构建并运行应用程序时,我立即收到错误:

  

Mono.Debugger.Soft.VMDisconnectedException:类型异常   抛出了'Mono.Debugger.Soft.VMDisconnectedException'。在   Mono.Debugger.Soft.Connection.SendReceive(CommandSet command_set,   Int32命令,Mono.Debugger.Soft.PacketWriter包)[0x00000] in   :Mono.Debugger.Soft.Connection.VM_GetVersion中的0   ()[0x00000] in:0 at   Mono.Debugger.Soft.Connection.Connect()[0x00000] in:0 at Mono.Debugger.Soft.VirtualMachine.connect()   [0x00000] in:0 at   Mono.Debugger.Soft.VirtualMachineManager.ListenInternal   (System.Net.Sockets.Socket dbg_sock,System.Net.Sockets.Socket   con_sock)[0x00000] in:0

并且没有应用程序输出。如果我签名或不签名库似乎没关系,我已经尝试了各种版本和构建设置甚至在编译器之间切换(我使用的最后一个编译器是库存GCC 4.2编译器)。 WHM

当我为模拟器构建库并将其链接到应用程序以在设备上运行时它实际上在设备上运行,但是一旦调用了一个函数,应用程序退出并且我得到系统输出来解释pinvoke无法解决。

这个没有运行的原因可能是因为构建设置或某个地方,因为它在模拟器上运行它可能是JIT与AOT问题。'

编辑:

这是C#方面的事情:

        [DllImport("__Internal")]
        private static extern int CreateWorld(b2Vec2 grav, OnIOSContact startContact, ContactOver endContact);

    delegate bool OnIOSContact(MyCollisionEvent ev);
    delegate bool ContactOver(MyCollisionEvent ev);

    [MonoTouch.MonoPInvokeCallback(typeof(OnIOSContact))]
    static bool StatContactStart(MyCollisionEvent ev){...}

    [MonoTouch.MonoPInvokeCallback(typeof(ContactOver))]
    static bool StatContactEnd(MyCollisionEvent ev){...}


    [StructLayout(LayoutKind.Sequential, Size=8),Serializable]
    struct MyCollisionEvent
    {
        public IntPtr ActorA;
        public IntPtr ActorB;
    }




    [StructLayout(LayoutKind.Sequential, Size=8),Serializable]
    public struct b2Vec2
    {
        public b2Vec2(float _x, float _y)
        {
            x = _x;
            y = _y;
        }
        public float x;
        public float y;
    }

及其背后的C代码:

       extern "C"
       int CreateWorld(b2Vec2 gravity, bool (*startContact)(Contact), bool (*endContact)(Contact))

 //contact struct to match MyCollisionEvent in C# code
 typedef struct
 {
     b2Body *bodyA;
     b2Body *bodyB;
 }Contact;

/// A 2D column vector.
struct b2Vec2
{
    /// Default constructor does nothing (for performance).
    b2Vec2() {}

    /// Construct using coordinates.
    b2Vec2(float32 x, float32 y) : x(x), y(y) {}

    /// Set this vector to all zeros.
    void SetZero() { x = 0.0f; y = 0.0f; }

    /// Set this vector to some specified coordinates.
    void Set(float32 x_, float32 y_) { x = x_; y = y_; }

    /// Negate this vector.
    b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; }

    /// Read from and indexed element.
    float32 operator () (int32 i) const
    {
        return (&x)[i];
    }

    /// Write to an indexed element.
    float32& operator () (int32 i)
    {
        return (&x)[i];
    }

    /// Add a vector to this vector.
    void operator += (const b2Vec2& v)
    {
        x += v.x; y += v.y;
    }

    /// Subtract a vector from this vector.
    void operator -= (const b2Vec2& v)
    {
        x -= v.x; y -= v.y;
    }

    /// Multiply this vector by a scalar.
    void operator *= (float32 a)
    {
        x *= a; y *= a;
    }

    /// Get the length of this vector (the norm).
    float32 Length() const
    {
        return b2Sqrt(x * x + y * y);
    }

    /// Get the length squared. For performance, use this instead of
    /// b2Vec2::Length (if possible).
    float32 LengthSquared() const
    {
        return x * x + y * y;
    }

    /// Convert this vector into a unit vector. Returns the length.
    float32 Normalize()
    {
        float32 length = Length();
        if (length < b2_epsilon)
        {
            return 0.0f;
        }
        float32 invLength = 1.0f / length;
        x *= invLength;
        y *= invLength;

        return length;
    }

    /// Does this vector contain finite coordinates?
    bool IsValid() const
    {
        return b2IsValid(x) && b2IsValid(y);
    }

    float32 x, y;
};

编辑2:

我应该在第一次撰写帖子时提到这一点,但我已经能够让设备在设备上运行几次了。通常它涉及使用稍微不同的构建设置(例如签署库)来重新构建项目/库,但是我无法辨别出需要采取哪些步骤来导致这些成功的构建......

每次运行它都会崩溃(由于无关的错误),但即使对代码稍作修改(例如注释掉一行)也会导致同样的错误再次弹出。即使恢复该线也不会使错误消失。

2 个答案:

答案 0 :(得分:1)

我没有看到任何明显的东西。尝试划分征服方法,即

  • 使用任何方法参数删除代码;然后
  • 删除一个(在另一个之后)参数(例如,首先是b2Vec2,然后是回调......)

直到你达到(稳固,永不崩溃)的工作点。这将使一个较小的测试用例检查:)

答案 1 :(得分:0)

经过多次痛苦后,我决定在iPhone上彻底安装iOS并修复错误。我仍然不太确定导致错误的是什么,但是因为一个干净的iOS安装修复它我只能假设它与之前的安装有关,并且希望非常特定于那个安装。