2011-09-05 100 views
0

我正在嘗試構建適用於Mac OSX的Firefox插件,它構建得很好,但我不明白鏈接器失敗的原因。Firefox NPAPI Xcode鏈接錯誤

這裏是連接器的日誌:

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 

我真的不明白我做了什麼不好的! 我錯過了圖書館鏈接?在此先感謝=)

編輯:添加代碼示例,從String2Variant在plugin.o的_NPN_MemAlloc:

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; 
     } 
    } 

回答

2

沒有庫,它提供NPN_MemAlloc,它實際上是你的回調之一當瀏覽器調用NP_Initialize時。你需要存儲aNPNFuncs參數,這樣就可以在以後使用它:當你需要調用NPN_MemAlloc你做這樣的

static NPNetscapeFuncs *sBrowserFuncs; 

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

    sBrowserFuncs = aNPNFuncs; 
} 

sBrowserFuncs->memalloc(len+1); 

或者你實際上定義功能NPN_MemAlloc中, test plugin這樣做:

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

好的,謝謝你的幫助。我認爲我必須做一些接近其他功能的東西?這兩種解決方案有什麼區別?當這個在Firefox中改變?你有鏈接嗎?再次感謝您的幫助=) – unpythonicguy

+0

是的,您需要爲其他功能做同樣的事情 - 簡單地複製測試插件中的代碼應該是最簡單的。這兩種解決方案之間沒有真正的區別,第二種方法只是允許您保持其他代碼不變(它可以繼續調用'NPN_MemAlloc'而不是調用'sBrowserFuncs-> memalloc')。而且 - 這並沒有改變,它一直是這樣的(見http://www.podgoretsky.com/ftp/docs/Internet/Netscape%20Plug-Ins/ch8.htm,這個解釋講述了Netscape ** Navigator ** 3.0這是古老的)。 –

+0

好的,謝謝。我詢問了這個變化,因爲這個插件是用xulrunner <1.8 – unpythonicguy