我正在研究我的第一个XPCOM组件。不幸的是,我无法成功注册。
建筑还可以。这是makefile
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 :(得分:1)
您显然已经看到了这一点,但供参考:https://developer.mozilla.org/en/Troubleshooting_XPCOM_components_registration
至于你的问题,我不是专家,但你似乎没有正确使用XPCOM Glue。文档说明在构建组件时不需要定义XPCOM_GLUE。 (如果这没有帮助,你应该发布到mozilla论坛(例如mozilla.dev.extensions或xpcom),真正的大师可能会看到你的问题,因为你可以看到很少有人精通这个版本/注册机械。)
顺便说一句,使用JS组件+1!
答案 1 :(得分: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:确保在链接行上的对象(.o)文件之后列出Gecko库。
答案 2 :(得分:0)
您是否尝试删除 -fshort-wchar 编译器选项?