Связывание 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'

...


person Devolus    schedule 29.05.2013    source источник
comment
Вы правильно настроили переменные пути? С сайта xerces: вам нужно добавить каталог xerces-c-3.1.1-{arch}-{os}-{compiler}/bin в переменную среды PATH:   -  person ChrisCM    schedule 29.05.2013
comment
Когда я компилирую основное приложение, оно работает. Только общая библиотека доставляет мне проблемы. Мое предположение состоит в том, что общие символы должны быть каким-то образом перенаправлены в основное приложение, и их не нужно разрешать в общей библиотеке.   -  person Devolus    schedule 29.05.2013


Ответы (1)


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

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

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

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

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

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

person Devolus    schedule 30.05.2013