ошибка компоновщика при связывании учебника будильника буфера (неопределенные ссылки)

Я установил boost на Fedora 20 через yum и пробую некоторые простые примеры. Однако мне трудно скомпилировать первый пример из учебника по протоколированию .

Компиляция с g++ -c boosttest.cc работает отлично, но я получаю много ошибок, когда я пытаюсь связать ее с

 g++ boosttest.o -o boosttest -lboost_log -lpthread 

полный журнал ошибок:

 boosttest.o: In function `main': boosttest.cc:(.text+0x44): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x9a): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x167): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x1bd): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x28a): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.o:boosttest.cc:(.text+0x2e0): more undefined references to `boost::log::v2s_mt_posix::trivial::logger::get()' follow boosttest.o: In function `boost::log::v2s_mt_posix::record::reset()': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix6record5resetEv[_ZN5boost3log12v2s_mt_posix6record5resetEv]+0x18): undefined reference to `boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)' boosttest.o: In function `boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt, boost::log::v2s_mt_posix::sources::multi_thread_model, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity, void, void, void, void, void, void, void, void, void> >::open_record<boost::parameter::aux::tagged_argument >(boost::parameter::aux::tagged_argument const&)': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresINS2_8severityIS6_EEvvvvvvvvvEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_[_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresINS2_8severityIS6_EEvvvvvvvvvEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_]+0x1e): undefined reference to `boost::log::v2s_mt_posix::core::get_logging_enabled() const' boosttest.o: In function `boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt >::~record_pump()': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEED2Ev[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEED5Ev]+0x2c): undefined reference to `boost::log::v2s_mt_posix::aux::unhandled_exception_count()' boosttest.o: In function `boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt&, boost::log::v2s_mt_posix::record&)': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC2ERS8_RNS1_6recordE[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC5ERS8_RNS1_6recordE]+0x1d): undefined reference to `boost::log::v2s_mt_posix::aux::stream_provider::allocate_compound(boost::log::v2s_mt_posix::record&)' boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC2ERS8_RNS1_6recordE[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC5ERS8_RNS1_6recordE]+0x28): undefined reference to `boost::log::v2s_mt_posix::aux::unhandled_exception_count()' boosttest.o: In function `boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt >::auto_release::~auto_release()': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEE12auto_releaseD2Ev[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEE12auto_releaseD5Ev]+0xf): undefined reference to `boost::log::v2s_mt_posix::aux::stream_provider::release_compound(boost::log::v2s_mt_posix::aux::stream_provider::stream_compound*)' boosttest.o: In function `boost::log::v2s_mt_posix::sources::aux::severity_level::set_value(boost::log::v2s_mt_posix::trivial::severity_level)': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_[_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_]+0x7): undefined reference to `boost::log::v2s_mt_posix::sources::aux::get_severity_level()' boosttest.o: In function `boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt, boost::log::v2s_mt_posix::sources::multi_thread_model >::open_record_unlocked<boost::parameter::aux::tagged_argument >(boost::parameter::aux::tagged_argument const&)': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_[_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_]+0x2a): undefined reference to `boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&)' boosttest.o: In function `boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt, boost::log::v2s_mt_posix::sources::multi_thread_model >::push_record_unlocked(boost::rv&)': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20push_record_unlockedERNS_2rvINS1_6recordEEE[_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20push_record_unlockedERNS_2rvINS1_6recordEEE]+0x36): undefined reference to `boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&)' collect2: error: ld returned 1 exit status 

Что мне не хватает? Что я делаю не так?

EDIT 1: порядок -lboost_log -lpthread не -lboost_log -lpthread на вывод. Существует также очень похожий вопрос , но решение для меня не работает. Ниже также приводятся ошибки с теми же ошибками:

 g++ -DBOOST_LOG_DYN_LINK boosttest.o -o boosttest -lboost_log -lpthread 

Просто добавьте строку

 #define BOOST_LOG_DYN_LINK 1 

как первая строка boosttest.cc .

В качестве альтернативы вы можете добавить -DBOOST_LOG_DYN_LINK к вашему этапу компиляции (а не шаг привязки, как вы разместили в вопросе):

 g++ -std=c++11 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c boosttest.cc g++ boosttest.o -lpthread -lboost_log -o boosttest 

У меня была такая же неприятная проблема. Макрос должен быть определен во время компиляции, а не для ссылки:

 g++ -std=c++11 -DBOOST_LOG_DYN_LINK -c boosttest.cc 

В команде компоновщика убедитесь, что порядок выглядит следующим образом:

 g++ boosttest.o -lboost_log -lpthread -o boosttest 

Посмотрите на ответ Марка Лаката в теме связывания журнала Boost

Моя проблема и, вероятно, проблема Михаэля, действительно являются наличием обоих .dylib и .a в / usr / local / lib. Поскольку я не планирую динамически связывать динамику, запуск sudo rm -f /usr/local/lib/libboost_*.dylib решает проблему и позволяет мне связывать статически. Программа, над которой я работаю, предназначена для перераспределения, и я хочу распространять один исполняемый файл без зависимостей, поэтому другие решения на этой странице не были работоспособны. Если это неприемлемо, вы также можете указать полный путь к lib, например -l / usr / include / lib / libboost_log.a, но это приводит к зависящим от системы make-файлам.

-lboost_log_setup решил проблему для меня.

Я заимствовал его из spdlog bench Makefile

 g++ -std=c++11 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c boost-bench-mt.cpp g++ boost-bench-mt.o -lpthread -lboost_log -lboost_log_setup -lboost_system -lboost_thread -o boost-bench-mt 

Вам просто нужно добавить определение BOOST_LOG_DYN_LINK . Итак, в команде с одним слоем:

 g++ -DBOOST_LOG_DYN_LINK logging_test.cpp -lboost_log -lpthread 

С этой командой он должен работать сейчас.

Кто-то добавил, чтобы добавить cflag BOOST_LOG_DYN_LINK. Я думаю, что это не совсем правда.

Чтобы использовать libboost_log, вы должны знать cxxflag библиотеки при ее создании. Возможно, флаг BOOST_LOG_DYN_LINK не добавлен в сборку.

Вы должны позаботиться о файле boost / log / detail / config.hpp о BOOST_LOG_VERSION_NAMESPACE.

В любом случае, вы должны сохранить одно и то же boost_log_version_namespace с связанным libboost_log.

Для проверки boost_log_version_namespace можно использовать команду: nm -C libboost_log | grep push_record_move

push_record_move – это одна из функций boost_log, она будет выводиться следующим образом: boost :: log :: v2s_mt_posix :: core :: push_record_move (boost :: log :: v2s_mt_posix :: record &)

v2s_mt_posix – это boost_log_version_namespace.

Если вы хотите, чтобы link boost.log статически, возможно, вам нужно сделать это (библиотеки в этом порядке)

 g++ main.cpp -static -lboost_log -lboost_system -lboost_thread -lpthread -o main 

Это просто означает, что библиотека boost-log не связана должным образом. Кроме того, заказ в GCC имеет значение. См. Этот вопрос .

  1. Сначала убедитесь, что библиотека правильно построена и в ней есть все символы.
  2. Попробуйте изменить порядок. Это может помочь вам.

на самом деле, для меня работает только g++ -DBOOST_ALL_DYN_LINK -lpthread -lboost_log-mt logging_test.cpp . DBOOST_LOG_DYN_LINK или -lboost_log получили ту же ошибку.

  • Как удалить неиспользуемые символы C / C ++ с помощью GCC и ld?
  • объединить два GCC скомпилированных .o объектных файлов в третий файл .o
  • Interesting Posts

    Факторы, влияющие на латентность сети

    Зависимость от Maven WAR

    Как пользователи / разработчики могут установить конфигурацию прокси-сервера Android для версий 2.x?

    Служба WCF, как увеличить таймаут?

    Синхронизировать ноутбук и рабочий стол

    На PCIe 1.0 64-разрядная графическая карта может быть совместима с 32-разрядной ОС (Windows 7 32bits)

    Java: как использовать UrlConnection для отправки запроса с авторизацией?

    Селектор jQuery: Id заканчивается?

    Эмуляция SD-карты как внутреннего жесткого диска

    Как сравнить два значения даты с jQuery

    C # простой способ скопировать или клонировать DataRow?

    Как полностью отключить использование файла подкачки wmic

    Редактор изображений, который позволяет сохранять множественные, отдельные, одновременные выборки культур? (Ищет бесплатные и платные программы)

    Как вызвать действие при двойном нажатии клавиши?

    Установка имени файла журнала для включения текущей даты в Log4j

    Давайте будем гением компьютера.