Je travaille sur mon premier composant XPCOM. Malheureusement, je ne peux pas l'enregistrer avec succès.Problèmes lors de l'enregistrement du composant XPCOM
La construction est correcte. Voici le 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)
J'ai créé un nouveau dossier d'extension sous le répertoire d'extension de mon profil de développement firefox. Les fichiers IComponent.xpt et Component.so sont placés dans le répertoire du composant. J'ai ensuite retiré les fichiers compreg.dat et xpti.dat de mon profil de développement firefox. Je l'ai redémarré, ce qui devrait automatiquement enregistrer les composants. Mais la visionneuse XPCOM n'a pas montré mon composant.
j'ai couru cette commande pour vérifier les erreurs
./run-mozilla.sh `which ldd` -r /path/to/component/Component.so
Il m'a montré plusieurs symboles non définis
...
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)
Je me sers nsAString et COMPtr dans mon code.
Y a-t-il un problème avec mes pas? Quelqu'un peut-il expliquer pourquoi y a-t-il des symboles indéfinis? Que signifient les symboles non définis? Comment les obtenez-vous reconnus?
En fait, je suis passé à javascript pour écrire XPCOM. C'est beaucoup plus facile! Je vais faire un blog sur l'écriture de javascript XPCOM bientôt – liangzan