Неопределенные символы для io_context: ошибка компоновки для последней библиотеки повышения - PullRequest
0 голосов
/ 18 сентября 2018

Мой код раньше хорошо копировался, пока библиотека буста не была обновлена ​​с изменениями в asio. В моем коде я определяю переменную: boost::shared_ptr<Face> face(boost::make_shared<ThreadsafeFace>(io_service));, которая, как видно, принимает io_service за конструктор. Face и ThreadsafeFace - это библиотека классов, на которые ссылается мое приложение. Проблема возникает на этапе связывания моего двоичного файла, где я получаю undefined symbols ошибка:

Undefined symbols for architecture x86_64:
  "ndn::ThreadsafeFace::ThreadsafeFace(boost::asio::io_context&)", referenced from:
      boost::detail::sp_if_not_array<ndn::ThreadsafeFace>::type boost::make_shared<ndn::ThreadsafeFace, boost::asio::io_context&>(boost::asio::io_context&&&) in ndnrtc_client-main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Как видно, компоновщик не может найти конструктор для ThreadsafeFace, который принимает аргумент boost::asio::io_context&. И это не будет - потому что библиотека не обеспечивает его. Единственная библиотека, которую она предоставляет - это аргумент io_service. Теперь, я не совсем понимаю, откуда берется это определение конструктора, так как ни мой код, ни код библиотеки не имеют этого определения.

Это заставляет меня думать, что с новым бустом (я связываюсь с 1.67, используя homebrew, macOS), io_service заменяется на io_context автоматически (во время предварительной обработки?), Что приводит к проблеме.

Я пытался указать -DBOOST_ASIO_ENABLE_OLD_SERVICES при компиляции моего кода, но это тоже не помогло.

Должен ли я понижать версию Boost до обновления библиотеки?

UPDATE Я выполнил clang для предварительной обработки (clang++ -E ...) и нашел это в выводе:

# 21 "/usr/local/include/boost/asio/io_service.hpp" 2 3

namespace boost {
namespace asio {



typedef io_context io_service;


}
}

Что подтверждает , что все io_service переменные на самом деле будут io_context и гарантируют головную боль.

1 Ответ

0 голосов
/ 18 сентября 2018

"Что подтверждает, что все переменные io_service будут фактически io_context и гарантируют головную боль"

На самом деле это гарантирует нет головных болей. Типовые определения псевдонимы : они абсолютно одинаковы. Таким образом, io_service становится просто еще одним способом обозначения того же типа, даже если в некоторых местах написание оказывается другим. Это на самом деле то, что вам нужно.

Чтение сообщения:

Неопределенные символы для архитектуры x86_64: "ndn :: ThreadsafeFace :: ThreadsafeFace (boost :: asio :: io_context &)", на который ссылаются из: boost :: detail :: sp_if_not_array :: type boost :: make_shared (boost :: asio :: io_context &&&) в ndnrtc_client-main.o ld: символы не найдены для архитектуры x86_64 clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова)

Это говорит о том, что ndn::ThreadsafeFace действительно предоставляет требуемый конструктор, поскольку на него ссылается ваш код. Если бы оно не было предоставлено, это была бы ошибка compile , а не ошибка link .

Так что ваша проблема в другом. Либо у вас нет входных данных компоновщика, либо объект библиотеки, на который вы ссылаетесь, был скомпилирован / по-другому / таким образом, что он не предоставляет определения конструктора, который объявляется при включении заголовка, который объявляет ThreadsafeFace. * 1030. *

Обычно это происходит, если изменяются пространства имен или когда вы (ab) использовали компилятор, определяющий значение кода (возможно, вы возились с чем-то вроде #define io_context io_service? Потому что - это a рецепт от головной боли).

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

Дополнительные советы по устранению неполадок см. В Что такое неопределенная ссылка / нерешенная внешняя ошибка символа и как ее исправить?

...