Неопределенная ошибка ссылки при связывании со статической библиотекой
Я пытаюсь скомпилировать проект, который зависит от Xerces XML Parser. Проект компилируется для Windows без каких-либо трудностей, но у меня возникли некоторые проблемы с компиляцией его с помощью g++ в Cygwin.
Чтобы использовать Xerces, я пытаюсь скомпилировать свой код против статической библиотеки libxerces-c.a
. Но когда я делаю это, я получаю ошибки, которые выглядят следующим образом:
/tmp/cc2QGvMh.o:test.cpp:(.text+0x3a): undefined reference to `xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)'
Я проверил статическую библиотеку с помощью ar
и подтвердил, что она содержит файл DOMImplementationRegistry.o
, который определяет функция, которую я вызываю.
ar -t libxerces-c.a
...
DOMImplementationImpl.o
DOMImplementationRegistry.o
DOMLocatorImpl.o
...
Я также извлек объектные файлы из библиотеки и использовал 'nm', чтобы убедиться, что вызываемая мной функция действительно существует:
ar -x libxerces-c.a
nm --demangle DOMImplementationRegistry.o
...
00000080 T xercesc_2_8::getDOMImplSrcVectorMutex()
00000300 T xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)
000002a0 T xercesc_2_8::DOMImplementationRegistry::addSource(xercesc_2_8::DOMImplementationSource*)
...
Поскольку я могу компилировать все для Windows, но не с g++, я подумал, что ошибка может быть в порядке компоновщика (аналогично проблеме, описанной в этот вопрос ). Однако даже после изменения порядка компоновщика я все равно получаю ту же ошибку компилятора. Я уже пробовал оба
g++ -o test.exe test.cpp -Llib -lxerces-c
И
g++ -o test.exe test.cpp lib/libxerces-c.a
Есть идеи?
3 ответа:
Вы не сказали источник архива. Если он не скомпилирован с помощью cygwin, это может быть проблемой искажения имен. Компиляция библиотеки из исходного кода вполне может исправить это.
Также может быть, что архив построен неправильно, так что у него есть внутренние проблемы с разрешением. Попробуйте дважды дать библиотеке имя.
g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a
Если это работает, архив сломан, и вы должны искать или создавать новый.