Я работаю над своим первым компонентом 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 в своем коде.
Что-то не так с моими шагами? Кто-нибудь может объяснить, почему существуют неопределенные символы? Что означают неопределенные символы? Как вы узнаете их?