2009-03-01 83 views
2

我正在处理我的第一个XPCOM组件。不幸的是,我无法成功注册。问题注册XPCOM组件

建筑是好的。这里的

CXX = g++ 
CPPFLAGS +=  -fno-rtti \ 
     -fexceptions \ 
     -shared \ 
       -fshort-wchar 

# Change this to point at your Gecko SDK directory. 
GECKO_SDK_PATH = /path/to/gecko/sdk 

# GCC only define which allows us to not have to #include mozilla-config 
# in every .cpp file. If your not using GCC remove this line and add 
# #include "mozilla-config.h" to each of your .cpp files. 
GECKO_CONFIG_INCLUDE = -include ${GECKO_SDK_PATH}/include/xpcom/xpcom-config.h 

GECKO_DEFINES = -DXPCOM_GLUE -DXPCOM_GLUE_USE_NSPR 

GECKO_INCLUDES = -I ${GECKO_SDK_PATH}/sdk/include \ 
       -I ${GECKO_SDK_PATH}/include/necko \ 
       -I ${GECKO_SDK_PATH}/include/nss \ 
       -I ${GECKO_SDK_PATH}/include/nspr 

GECKO_LDFLAGS = -L${GECKO_SDK_PATH}/lib -L${GECKO_SDK_PATH}/bin -Wl,-rpath-link,${GECKO_SDK_PATH}/bin -lxpcomglue_s -lxpcom -lnspr4  

FILES = Component.cpp ComponentModule.cpp 

TARGET = Component.so 

build: 
    $(CXX) -Wall -Os -o $(TARGET) $(GECKO_CONFIG_INCLUDE) $(GECKO_DEFINES) $(GECKO_INCLUDES) $(GECKO_LDFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(FILES) 
    chmod +x $(TARGET) 
    strip $(TARGET) 

clean: 
    rm $(TARGET) 

我我开发的Firefox配置文件的扩展名目录下创建一个新的扩展文件夹生成文件。 IComponent.xpt和Component.so文件放置在组件目录下。

然后我从我的开发firefox配置文件中删除了compreg.dat和xpti.dat。我重新启动它,它应该自动注册组件。但是XPCOM查看器没有显示我的组件。

我跑这个命令来检查错误

./run-mozilla.sh `which ldd` -r /path/to/component/Component.so 

这表明我的几个不确定的符号

... 
undefined symbol: _ZNK9nsAString12BeginReadingEv (/path/to/component/Component.so) 
undefined symbol: _ZNK10nsACString12BeginReadingEv (/path/to/component/Component.so) 
undefined symbol: _ZN9nsAString17DefaultComparatorEPKtS1_j (/path/to/component/Component.so) 
undefined symbol: _ZNK9nsAString6EqualsEPKtPFiS1_S1_jE (/path/to/component/Component.so) 
undefined symbol: _ZN9nsAString13AssignLiteralEPKc (/path/to/component/Component.so) 
undefined symbol: _ZN13nsCOMPtr_base16begin_assignmentEv (/path/to/component/Component.so) 
undefined symbol: _ZN13nsCOMPtr_baseD2Ev (/path/to/component/Component.so) 
undefined symbol: _Z16NS_TableDrivenQIPvPK12QITableEntryRK4nsIDPS_ (/path/to/component/Component.so) 
undefined symbol: _Z20NS_NewGenericModule2PK12nsModuleInfoPP9nsIModule (/path/to/component/Component.so) 

我一直在使用nsAString和COMPtr在我的代码。

我的步骤有什么问题吗?任何人都可以解释为什么有未定义的符号?未定义的符号是什么意思?你如何得到他们的认可?

+0

其实我切换到的JavaScript编写XPCOM。这很容易!我将很快写一篇关于编写javascript XPCOM的博客文章 – liangzan 2009-03-28 01:23:23

回答

0

您是否试图删除-fshort-wchar编译选项?

1

你已经清楚地看到这一点,但对于参考:https://developer.mozilla.org/en/Troubleshooting_XPCOM_components_registration

至于你的问题,我不是专家,但你似乎已经无法使用XPCOM Glue正常。该文档说您在构建组件时不需要定义XPCOM_GLUE。 (如果这没有帮助,你应该发布到mozilla论坛(例如mozilla.dev.extensions或xpcom),真正的大师可能会看到你的问题,因为你可以看到很少有人熟悉构建/注册机器。)

+1上使用JS组件,顺便说一下!

1

在我的情况下,帮助移动$(GECKO_LDFLAGS)变到最后,即替换:

$(CXX) -Wall -Os -o $(TARGET) $(GECKO_CONFIG_INCLUDE) $(GECKO_DEFINES) $(GECKO_INCLUDES) $(GECKO_LDFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(FILES) 

$(CXX) -Wall -Os -o $(TARGET) $(GECKO_CONFIG_INCLUDE) $(GECKO_DEFINES) $(GECKO_INCLUDES) $(CPPFLAGS) $(CXXFLAGS) $(FILES) $(GECKO_LDFLAGS) 

阅读后:

的Linux和Mac:确保Gecko库在链接行上的对象(.o)文件之后列出。

this page that gives instructions on XPCOM Linking: