Xcode 静态库中断生成
我在xcode中编译了一个针对“iOS设备”的静态库,并将其链接到一个monotouch应用程序。当我构建并运行应用程序时,我立即收到一个错误: Mono.Debugger.Soft.VMDisconnectedException:类型的异常 引发了“Mono.Debugger.Soft.VMDisconnectedException”。在 Mono.Debugger.Soft.Connection.SendReceive(命令集命令集, Int32命令,Mono.Debugger.Soft.PacketWriter包)[0x00000]位于 :0位于Mono.Debugger.Soft.Connection.VM\u GetVersion ()[0x00000]英寸:0英寸 Mono.Debugger.Soft.Connection.Connect()[0x00000]位于:0中的Mono.Debugger.Soft.VirtualMachine.Connect() [0x00000]英寸:0英寸 Mono.Debugger.Soft.VirtualMachineManager.listenternal (System.Net.Sockets.Socket dbg_sock,System.Net.Sockets.Socket con_sock)[0x00000]英寸:0 并且没有应用程序输出。我是否对库签名似乎并不重要,我已经尝试了各种版本和构建设置,甚至在编译器之间切换(我使用的最后一个编译器是股票GCC4.2编译器)。Whm 当我为模拟器构建库并将其链接到应用程序以在设备上运行时,它实际上在设备上运行,但一旦p/调用某个函数,应用程序就会退出,我会得到系统输出,说明pinvoke无法解决 它没有运行的原因可能是由于构建设置或其他原因,因为它在模拟器上运行,这可能是JIT与AOT的问题。” 编辑: 这是事情的C#端:Xcode 静态库中断生成,xcode,mono,xamarin.ios,pinvoke,static-libraries,Xcode,Mono,Xamarin.ios,Pinvoke,Static Libraries,我在xcode中编译了一个针对“iOS设备”的静态库,并将其链接到一个monotouch应用程序。当我构建并运行应用程序时,我立即收到一个错误: Mono.Debugger.Soft.VMDisconnectedException:类型的异常 引发了“Mono.Debugger.Soft.VMDisconnectedException”。在 Mono.Debugger.Soft.Connection.SendReceive(命令集命令集, Int32命令,Mono.Debugger.Soft.P
[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;
};
extern“C”
int CreateWorld(b2Vec2重力,布尔(*起始触点)(触点),布尔(*结束触点)(触点))
//联系struct以匹配C#代码中的MyCollisionEvent
类型定义结构
{
b2Body*bodyA;
b2Body*bodyB;
}接触;
///二维列向量。
结构b2Vec2
{
///默认构造函数不做任何事情(为了性能)。
b2Vec2(){}
///使用坐标构造。
b2Vec2(float32x,float32y):x(x),y(y){
///将此向量设置为全零。
void SetZero(){x=0.0f;y=0.0f;}
///将此向量设置为某些指定的坐标。
空集(float32 x_u2;,float32 y_2;{x=x_2;;y=y_2;}
///对这个向量求反。
b2Vec2运算符-()常量{b2vec2v;v.Set(-x,-y);返回v;}
///读取并索引元素。
float32运算符()(int32 i)常量
{
返回(&x)[i];
}
///写入索引元素。
float32&运算符()(int32 i)
{
返回(&x)[i];
}
///向该向量添加一个向量。
无效运算符+=(常量b2Vec2&v)
{
x+=v.x;y+=v.y;
}
///从这个向量中减去一个向量。
无效运算符-=(常量b2Vec2&v)
{
x-=v.x;y-=v.y;
}
///将这个向量乘以一个标量。
无效运算符*=(浮点32 a)
{
x*=a;y*=a;
}
///获取此向量的长度(范数)。
float32长度()常量
{
返回b2Sqrt(x*x+y*y);
}
///得到长度的平方。为了提高性能,请使用此值而不是
///b2Vec2::长度(如果可能)。
float32长度平方()常数
{
返回x*x+y*y;
}
///将此向量转换为单位向量。返回长度。
float32规范化()
{
float32长度=长度();
if(长度
编辑2:
我第一次写这篇文章的时候就应该提到这一点,但我已经在设备上运行了好几次了。通常,它涉及使用稍微不同的构建设置(例如对库签名)重新构建项目/库,但我无法识别导致这些成功构建的需要采取的步骤
每次运行时,它都会崩溃(由于不相关的bug),但即使是对代码的轻微修改(例如注释一行),也会再次出现相同的错误。即使恢复线路也不能消除错误。我看不到任何明显的错误。尝试一种分而治之的方法,即
- 使用任何方法参数删除代码;然后
- 删除一个(一个接一个)参数(例如,首先删除b2Vec2,然后删除回调…)
直到你到达一个(牢固的,永不崩溃的)工作点。这将产生一个更小的测试用例来检查:)在经历了很多痛苦之后,我决定在iPhone上进行iOS的干净安装,并修复了错误。我仍然不太确定是什么原因导致了这些错误,但由于一个干净的iOS安装修复了它,我只能假设它与以前的安装有关,并且希望它非常特定于那个安装 您可以编辑您的帖子,使其在C#(包括属性)和C中都包含p/invoke签名吗?谢谢你。这是被调用的特定函数(也是第一个被pinked的函数)。如果库是为模拟器构建的,我不确定它是否应该在设备上工作。请还包括非基本类型的托管/本机定义,例如b2Vec2、Contact、OnisContact和ContactOver。您的随机崩溃很可能是由于在托管/本机表示不匹配时错误处理堆栈造成的。好的,我想这就是所有相关代码:)好的,我只是再次尝试删除所有外部“C”函数和试图调用这些外部“C”函数的C#函数。只需将库链接到中,而无需在代码中的任何位置调用库中的任何函数。我还是有同样的问题。我确实发现,如果我重建lib并将其拖动到链接的现有lib上,然后重建整个解决方案,编译和运行应用程序将实际运行,但随后它将同时运行