2009-03-01 6 views
2

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?

+0

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

Répondre

0

Avez-vous essayé d'enlever l'option de compilateur -fshort-wchar?

1

Vous avez apparemment vu, mais pour la référence: https://developer.mozilla.org/en/Troubleshooting_XPCOM_components_registration

En ce qui concerne votre problème, je ne suis pas un expert, mais vous semblez avoir échoué à utiliser XPCOM Glue correctement. La documentation indique que vous n'avez pas besoin de définir XPCOM_GLUE lors de la construction d'un composant. (Si cela ne vous aide pas, vous devriez poster sur des forums mozilla (par exemple mozilla.dev.extensions ou xpcom), où les vrais gourous verront probablement votre question, puisque comme vous pouvez le voir, peu de gens connaissent bien la construction/machines d'enregistrement.)

+1 sur l'utilisation de composants JS, en passant!

1

Dans mon cas, il a aidé à déplacer la variable $ (GECKO_LDFLAGS) à la fin, à savoir le remplacement:

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

avec

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

après lecture:

Linux et Mac: Assurez-vous que les bibliothèques Gecko sont répertoriées après vos fichiers objet (.o) sur la ligne de liaison.

sur this page that gives instructions on XPCOM Linking:

Questions connexes