我正在尝试为Mac OSX构建一个Firefox插件,它构建得很好,但我不明白链接器失败的原因。
以下是链接器的日志:
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
我真的不明白我做错了什么! 我错过了要链接的库吗?在此先感谢=)
编辑:为plugin.o中的String2Variant的_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;
}
}
答案 0 :(得分:2)
没有提供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
函数,test plugin的方式:
void*
NPN_MemAlloc(uint32_t size)
{
return sBrowserFuncs->memalloc(size);
}