Я создаю общую библиотеку / 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'
…
Наконец, после нескольких дней изучения этой проблемы, я нашел решение. Это так же просто, как глупо.
Моя оригинальная командная строка компоновщика выглядела так:
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
Обратите внимание, что в приведенной выше строке объекты располагаются перед библиотекой, и, по-видимому, это имеет значение. Я думал, что упорядочение библиотек относится только к библиотекам, но, видимо, также объекты должны быть упорядочены соответствующим образом.
Других решений пока нет …