Сборка статических библиотек - PullRequest
0 голосов
/ 16 августа 2011

Я скомпилировал статическую библиотеку, предназначенную для iOS-устройства, в xcode и связал ее с приложением monotouch.Когда я собираю и запускаю приложение, я сразу же получаю сообщение об ошибке:

Mono.Debugger.Soft.VMDisconnectedException: исключение типа 'Mono.Debugger.Soft.VMDisconnectedException'.в Mono.Debugger.Soft.Connection.SendReceive (Command_set command_set, команда Int32, пакет Mono.Debugger.Soft.PacketWriter) [0x00000] в: 0 в Mono.Debugger.Soft.Connection.VM_GetVersion () [0x00000] в: 0в Mono.Debugger.Soft.Connection.Connect () [0x00000] в: 0 в Mono.Debugger.Soft.VirtualMachine.connect () [0x00000] в: 0 в 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 vs. AOT. '

edit:

Это сторона 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;
};

Edit 2:

Я должен был упомянуть об этом, когда впервые написал пост, но мне удалось несколько раз запустить приложение на устройстве.Как правило, это включало пересоздание проекта / библиотеки с немного отличающимися настройками сборки (например, подписывание библиотеки), но я не смог разглядеть шаги, которые необходимо предпринять, что приводит к успешной сборке ...

Каждаякогда он запускался, он выходил из строя (из-за несвязанных ошибок), но даже небольшое изменение кода (например, комментирование строки) приводило к повторному появлению той же ошибки.Даже восстановление линии не устранит ошибку.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Я не вижу ничего очевидного.Попробуйте разделить подход «завоевать», то есть

  • удалить код, используя любые параметры метода;затем
  • удаляет один (после другого) параметра (например, сначала b2Vec2, затем обратные вызовы ...)

до тех пор, пока вы не достигнете (полностью, никогда не сбойной) рабочей точки.Это сделает меньший контрольный пример для проверки:)

0 голосов
/ 22 августа 2011

После большой боли я решил, что я сделаю чистую установку iOS на iPhone, и это исправит ошибки. Я все еще не совсем уверен, что было причиной ошибок, но, поскольку чистая установка iOS исправила это, я могу только предположить, что это было связано с предыдущей установкой и, мы надеемся, было очень специфичным для этой одной установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...