Компиляция приводит к ошибке "неопределенные символы для архитектуры i386" - PullRequest
0 голосов
/ 13 августа 2011

Я скомпилировал библиотеку Box2D в Xcode, которая сгенерировала статический файл библиотеки.

Я связал эту библиотеку с mono touch, но когда я пытаюсь скомпилировать, я получаю ошибки о неопределенных символах в различных исходных файлах.

Я посмотрел первые несколько, и они, кажется, жалуются на инициализацию указателя (то есть используя 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, я не уверен, как я мог решить эту проблему в моно касании?

edit: В ответ на ответ Mark Bs, который я хотел бы добавить, я загружаю библиотеку следующей командной строкой:

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

Что должно означать, что библиотека загружена с C ++ согласно этой документации

Ответы [ 3 ]

3 голосов
/ 13 августа 2011

Это может немного сбивать с толку, но -cxx является дополнительным параметром для mtouch , а не для --gcc_flags (которые напрямую передаются компилятору gcc ).

Таким образом, дополнительный аргумент mtouch должен выглядеть следующим образом:

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

-cxx обеспечит использование g ++ вместо gcc - и это должно решить вашу проблему.

3 голосов
/ 28 июня 2013

Измените файл .m на мм, он отлично сработал для меня

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

На первый взгляд это звучит так, как будто вы связываете C, а не C ++, поэтому он не получает нужную стандартную библиотеку.

...