Неопределенная ошибка ссылки при связывании со статической библиотекой


Я пытаюсь скомпилировать проект, который зависит от 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 4

3 ответа:

Вы не сказали источник архива. Если он не скомпилирован с помощью cygwin, это может быть проблемой искажения имен. Компиляция библиотеки из исходного кода вполне может исправить это.

Также может быть, что архив построен неправильно, так что у него есть внутренние проблемы с разрешением. Попробуйте дважды дать библиотеке имя.

g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a

Если это работает, архив сломан, и вы должны искать или создавать новый.

Ваш проект использует метод из пространства имен xercesc_2_6, как указано в сообщении об ошибке компилятора, но ваша библиотека предлагает версию xercesc_2_8. Проблема, вероятно, вызвана несоответствием между заголовками, которые вы используете, и файлом объекта библиотеки.

Попробуйте опцию компоновщика -- enable-stdcall-fixup (см. 'man ld'). Он будет заботиться о искажении имен и условностях вызова:

g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c