Ошибки ссылок Firefox NPAPI Xcode - PullRequest
0 голосов
/ 05 сентября 2011

Я пытаюсь создать плагин Firefox для Mac OSX, он хорошо собирается, но я не понимаю, почему не работает компоновщик.

Вот лог компоновщика:

Undefined symbols:
  "_NPN_ReleaseVariantValue", referenced from:
      _NPP_New in npp_gate.o
      _NPP_New in npp_gate.o
  "_NPN_MemAlloc", referenced from:
      String2Variant(_NPVariant*, char const*)in plugin.o
  "_NPN_GetValue", referenced from:
      _NPP_New in npp_gate.o
  "_NPN_ReleaseObject", referenced from:
      CPlugin::~CPlugin()in plugin.o
      CPlugin::~CPlugin()in plugin.o
  "_NPN_Version", referenced from:
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
  "_NPN_UserAgent", referenced from:
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
  "_NPN_GetProperty", referenced from:
      _NPP_New in npp_gate.o
      _NPP_New in npp_gate.o
  "_NPN_GetURL", referenced from:
      _NPP_New in npp_gate.o
      CPluginData::Fire_OnZoomChange()       in CTPlugin.o
      CPluginData::Fire_OnPIPMove()       in CTPlugin.o
      CPluginData::Fire_OnItem(int, bool)in CTPlugin.o
      CPluginData::Fire_OnClose(char const*)in CTPlugin.o
      CPluginData::Fire_OnWheel(int)    in CTPlugin.o
      CPluginData::Fire_OnRightClick(int, int)in CTPlugin.o
      CPluginData::Fire_OnKeyPress(unsigned short)in CTPlugin.o
      CPluginData::Fire_OnMouseDn(int, int)in CTPlugin.o
      CPluginData::Fire_OnMouseUp(int, int)in CTPlugin.o
      CPluginData::Fire_OnMouseMove(int, int)in CTPlugin.o
      CPluginData::Fire_OnClick(int, int)in CTPlugin.o
      CPluginData::Fire_OnSelect()       in CTPlugin.o
      CPluginData::Fire_OnStatus(char const*)in CTPlugin.o
      CPluginData::Fire_OnImage(int, int, int, int)in CTPlugin.o
  "_NPN_CreateObject", referenced from:
      CPlugin::GetScriptableObject()      in plugin.o
  "_NPN_GetStringIdentifier", referenced from:
      _NPP_New in npp_gate.o
      _NPP_New in npp_gate.o
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
      CPlugin::CPlugin(_NPP*)in plugin.o
  "_NPN_InvalidateRect", referenced from:
      CPluginData::Refresh(bool)  in CTPlugin.o
  "_NPN_RetainObject", referenced from:
      CPlugin::GetScriptableObject()      in plugin.o

Я действительно не понимаю, что я сделал плохо! Я пропустил ссылки на библиотеки? Заранее спасибо =)

РЕДАКТИРОВАТЬ: Добавить пример кода для _NPN_MemAlloc из String2Variant в plugin.o:

static void String2Variant(NPVariant *result, LPCTSTR value)
    {
        if (value)
        {
            ClassUnicode cu;
            char *utf8String = cu.CurrentModeToUTF8(value);

            uint32 len = (uint32) strlen(utf8String);
            char *clone = (char *)NPN_MemAlloc(len+1);
            memcpy(clone,utf8String,len);
            clone[len] = '\0';
        } else
        {
            result->type = NPVariantType_String;
            result->value.stringValue.UTF8Characters = NULL;
            result->value.stringValue.UTF8Length = 0;
        }
    }

1 Ответ

2 голосов
/ 05 сентября 2011

Нет библиотеки, предоставляющей NPN_MemAlloc, это фактически один из обратных вызовов, которые вы получаете, когда браузер вызывает NP_Initialize.Вам нужно сохранить параметр aNPNFuncs, чтобы вы могли использовать его позже:

static NPNetscapeFuncs *sBrowserFuncs;

NPError NP_Initialize(NPNetscapeFuncs *aNPNFuncs, NPPluginFuncs *aNPPFuncs)
{
   // Sanity checks go here

   sBrowserFuncs = aNPNFuncs;
}

Когда вам нужно позвонить NPN_MemAlloc, вы делаете это так:

sBrowserFuncs->memalloc(len+1);

Иливы на самом деле определяете функцию NPN_MemAlloc, как это делает тестовый плагин :

void*
NPN_MemAlloc(uint32_t size)
{
  return sBrowserFuncs->memalloc(size);
}
...