Проблемы с регистрацией компонента XPCOM - PullRequest
2 голосов
/ 01 марта 2009

Я работаю над своим первым компонентом 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 находятся там в каталоге компонентов.

Затем я удалил compreg.dat и xpti.dat из своего профиля Firefox для разработчиков. Я перезапустил его, который должен автоматически зарегистрировать компоненты. Но программа просмотра 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 в своем коде.

Что-то не так с моими шагами? Кто-нибудь может объяснить, почему существуют неопределенные символы? Что означают неопределенные символы? Как вы узнаете их?

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Вы, видимо, видели это, но для справки: https://developer.mozilla.org/en/Troubleshooting_XPCOM_components_registration

Что касается вашей проблемы, я не эксперт, но вы, похоже, не смогли правильно использовать XPCOM Glue . В документации сказано, что вам не нужно определять XPCOM_GLUE при создании компонента. (Если это не помогает, вы должны публиковать сообщения на форумах mozilla (например, mozilla.dev.extensions или xpcom), где настоящие гуру, скорее всего, увидят ваш вопрос, поскольку, как вы можете видеть, мало кто разбирается в сборке / регистрация техники.)

+ 1 об использовании компонентов JS, кстати!

1 голос
/ 13 октября 2010

В моем случае это помогло переместить переменную $ (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) в строке ссылки.

на эта страница, которая дает инструкции по связыванию XPCOM:

0 голосов
/ 27 марта 2009

Вы пытались удалить опцию компилятора -fshort-wchar ?

...