Мой код раньше хорошо копировался, пока библиотека буста не была обновлена с изменениями в 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
и гарантируют головную боль.