编译结果错误“架构i386的未定义符号”

时间:2011-08-13 12:49:15

标签: c++ ios xcode mono xamarin.ios

我在Xcode中编译了Box2D库,它生成了一个静态库文件。

我将此库链接到单声道触摸,但是当我尝试编译时,我在各种源文件中收到有关未定义符号的错误。

我看过前几个,他们似乎在抱怨指针初始化(例如使用malloc / new),例如:

Undefined symbols for architecture i386:
  "std::terminate()", referenced from:
      b2BroadPhase::b2BroadPhase()in libBox2D.a(b2BroadPhase.o)
      b2BroadPhase::~b2BroadPhase()in libBox2D.a(b2BroadPhase.o)
      b2BroadPhase::~b2BroadPhase()in libBox2D.a(b2BroadPhase.o)
      b2BroadPhase::b2BroadPhase()in libBox2D.a(b2BroadPhase.o)
      b2Island::Solve(b2TimeStep const&, b2Vec2 const&, bool)in libBox2D.a(b2Island.o)
      b2World::b2World(b2Vec2 const&, bool)in libBox2D.a(b2World.o)
      b2World::SolveTOI(b2Body*)     in libBox2D.a(b2World.o)

b2BroadPhase构造函数如下所示:

b2BroadPhase::b2BroadPhase()
{
    m_proxyCount = 0;

    m_pairCapacity = 16;
    m_pairCount = 0;
    m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));

    m_moveCapacity = 16;
    m_moveCount = 0;
    m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));
}

b2Alloc功能很简单:

void* b2Alloc(int32 size)
{
    return malloc(size);
}

并且注释掉两个调用b2Alloc的行会在链接库时发生错误消失,但显然这不是解决问题的方法。

我发现其他人遇到了类似的问题,但他们所有的问题都是用Xcode编译的,我不知道如何用单声道触摸解决这个问题?

编辑:为了回应Mark Bs的回答我想添加我用以下命令行加载lib:

-gcc_flags "-L${ProjectDir} -lBox2D -cxx -force_load
${ProjectDir}/libBox2D.a"

这应该意味着lib按照this documentation

加载了C ++

3 个答案:

答案 0 :(得分:3)

这可能有点令人困惑,但 -cxx mtouch 的额外参数,而不是--gcc_flags(直接传递给 gcc 编译器。)

所以mtouch额外的参数应该是这样的:

 -cxx -gcc_flags "-L${ProjectDir} -lBox2D -force_load ${ProjectDir}/libBox2D.a"

-cxx 将确保使用g ++代替gcc - 这应该可以解决您的问题。

答案 1 :(得分:3)

将.m文件更改为mm,它对我来说非常合适

答案 2 :(得分:1)

乍一看,您将链接为C而不是C ++,因此无法获得正确的标准库。