Связывание DLL с помощью xerces дает неопределенные символы

Я создаю общую библиотеку / DLL с использованием Cygwin, который использует Xerces. Когда я вызываю функции xercesc из основного приложения, все в порядке, но когда я пытаюсь поместить некоторый код в библиотеку, я получаю неопределенные символы для всех статических элементов, которые определяет xerxesc.

Например:

std::string fromXMLString(XMLCh *oXMLString)
{
std::string result;
xercesc::DOMImplementation *impl =  xercesc::DOMImplementationRegistry::getDOMImplementation(X("Core"));

char *temp = xercesc::XMLString::transcode(oXMLString);
result = temp;

xercesc::XMLString::release(&temp);
return result;
}

Связь:

g++ -shared -Wl,-soname,cygsupport.so  -L /usr/local/lib -l xerces-c -o cygsupport.so obj/helper/xml_helper.o

При связывании библиотеки я получаю:

/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::DOMImplementationRegistry::getDOMImplementation(wchar_t const*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::transcode(wchar_t const*, xercesc_3_1::MemoryManager*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::release(char**, xercesc_3_1::MemoryManager*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::release(wchar_t**, xercesc_3_1::MemoryManager*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'

1

Решение

Наконец, после нескольких дней изучения этой проблемы, я нашел решение. Это так же просто, как глупо.

Моя оригинальная командная строка компоновщика выглядела так:

g++ -shared -o mylib.so -L/usr/local/lib -lxerces-c objects...

Поиск по этой проблеме ничего полезного не принес, поэтому в конце концов я решил создать новый образец проекта с eclipse, и вдруг он сработал. Единственная разница была в командной строке для компоновщика. Когда я применил тот же порядок к своему основному проекту, он неожиданно скомпилировался.

g++ -L/usr/local/lib -shared -o mylib.so objects... -lxerces-c

Обратите внимание, что в приведенной выше строке объекты располагаются перед библиотекой, и, по-видимому, это имеет значение. Я думал, что упорядочение библиотек относится только к библиотекам, но, видимо, также объекты должны быть упорядочены соответствующим образом.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]