Динамически связанные библиотеки C++, загружаемые во время выполнения — Poco/qmake

У меня проблемы с Boost и Mac OS X.

Я использую Qt Creator в качестве платформы для разработки проектов на C++, прежде всего из-за IDE и qmake.

Прямо сейчас я работаю над приложением C++, которое должно быть кросс-платформенным, но я не хочу использовать саму структуру Qt. Вместо этого я использую библиотеки STD (C++11), Poco и Boost.

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

Я видел несколько проектов, таких как Boost-extension, который больше не поддерживается, и несколько других.

Сейчас я использую общие библиотеки Poco и их Class Loader. Я внимательно слежу за учебным пособием в конце презентации. К сожалению, я не могу заставить его работать, и я получаю следующую ошибку при компиляции, где класс ServiceBase является интерфейсом моего плагина.

Undefined symbols for architecture x86_64:
"Poco::SharedLibrary::getSymbol(std::string const&)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
  "Poco::SharedLibrary::hasSymbol(std::string const&)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
  "Poco::SharedLibrary::SharedLibrary(std::string const&)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
  "Poco::SystemException::SystemException(std::string const&, int)", referenced from:
      Poco::MutexImpl::unlockImpl() in main.o
      Poco::MutexImpl::lockImpl() in main.o
  "Poco::LibraryLoadException::LibraryLoadException(std::string const&, std::string const&, int)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
ld: symbol(s) not found for architecture x86_64

У меня есть связанные библиотеки Poco, и почти все, кажется, реализовано.

Любые советы о том, как это исправить?

P.S. Я также ищу альтернативы реализации системы плагинов, возможно, более мощные и, безусловно, кроссплатформенные.


person Itay Grudev    schedule 07.04.2014    source источник


Ответы (1)


Отказ от ответственности. У меня нет опыта работы с этой библиотекой Poco.

Без дальнейших подробностей о вашей среде или ваших инструментах... Я могу дать только несколько очень общих советов:

Как бы я преследовал это:

  1. Найдите, в какой библиотеке или объектном файле определены символы, указанные как неопределенные символы. В unix-подобных средах это можно сделать с помощью инструмента nm.
  2. Убедитесь, что библиотеки или объекты скомпилированы для правильной архитектуры (я вижу, вы используете x86_64) file инструмент может помочь вам
  3. Убедитесь, что вы ссылаетесь на библиотеку в командной строке компоновщика (ищите -l для динамических или статических библиотек) или что вы включаете объектный файл или статическую библиотеку в список вещей для связывания.
  4. Убедитесь, что вы ссылаетесь на правильную библиотеку (либо с помощью флагов -L, либо с помощью переменной env LD_LIBRARY_PATH (или LD_LIBRARY_PATH_64 в некоторых системах, например, Solaris для 64-битной сборки)

Я знаю, вы сказали, что связали библиотеки Poco, но ошибка явно в том, что символ отсутствует. Либо библиотека отсутствует, либо вам нужно изменить порядок флагов -l, чтобы удовлетворить зависимости. Здесь nm может помочь вам определить, какие объекты или библиотеки ссылаются на символ (должны идти первыми) и какие объекты или библиотеки определяют символ (должны идти позже).

Извините, что больше не помогу.

P.S. Кроме того, вы можете просмотреть ошибку связывания с Poco Net, которая может быть связана.

Еще одна ссылка на вопрос, в котором подробно описаны различные причины ошибок компоновщика: Что такое ошибка неопределенной ссылки/неразрешенного внешнего символа и как ее исправить?

person jsantander    schedule 10.04.2014