2013-09-18 3 views
16

Я пишу программу, которая использует библиотеки Boost. У меня не было проблем с связыванием и использованием опций программы, но я не могу заставить журнал бухгалтерии работать правильно. Может ли кто-нибудь сказать мне, что мне не хватает?Boost logger linking issue

jamroot.jam

using clang : : : <compileflags>-Isrc/main/headers <compileflags>-std=c++11 <compileflags>-stdlib=libc++ <linkflags>-std=c++11 <linkflags>-stdlib=libc++ ; 
lib boost_program_options boost_log ; 
exe foghorn : [ glob src/main/cpp/*.cpp ] boost_program_options boost_log ; 

Это ошибка я получаю:

"boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", referenced from: 
     boost::log::v2s_mt_posix::record::reset() in main.o 
    "boost::log::v2s_mt_posix::attribute_set::insert(boost::log::v2s_mt_posix::attribute_name, boost::log::v2s_mt_posix::attribute const&)", referenced from: 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::add_attribute_unlocked(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute const&) in main.o 
     boost::log::v2s_mt_posix::aux::attribute_set_reference_proxy::operator=(boost::log::v2s_mt_posix::attribute const&) const in main.o 
    "boost::log::v2s_mt_posix::attribute_set::attribute_set(boost::log::v2s_mt_posix::attribute_set const&)", referenced from: 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::basic_logger(boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model> const&) in main.o 
    "boost::log::v2s_mt_posix::attribute_set::attribute_set()", referenced from: 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::basic_logger() in main.o 
    "boost::log::v2s_mt_posix::attribute_set::~attribute_set()", referenced from: 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::~basic_logger() in main.o 
    "boost::log::v2s_mt_posix::attribute_name::get_id_from_string(char const*)", referenced from: 
     boost::log::v2s_mt_posix::attribute_name::attribute_name(char const*) in main.o 
    "void boost::log::v2s_mt_posix::init_from_stream<char>(std::__1::basic_istream<char, std::__1::char_traits<char> >&)", referenced from: 
     __ZL13gvLoggingInitPKc in main.o 
    "boost::log::v2s_mt_posix::aux::this_thread::get_id()", referenced from: 
     boost::log::v2s_mt_posix::attributes::current_thread_id::impl::dispatch(boost::log::v2s_mt_posix::type_dispatcher&) in main.o 
     boost::log::v2s_mt_posix::attributes::current_thread_id::impl::detach_from_thread() in main.o 
    "boost::log::v2s_mt_posix::aux::this_process::get_id()", referenced from: 
     boost::log::v2s_mt_posix::attributes::current_process_id::current_process_id() in main.o 
    "boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*)", referenced from: 
     boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel> >::auto_release::~auto_release() in main.o 
    "boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&)", referenced from: 
     boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>&, boost::log::v2s_mt_posix::record&) in main.o 
    "boost::log::v2s_mt_posix::aux::get_process_name()", referenced from: 
     boost::log::v2s_mt_posix::attributes::current_process_name::current_process_name() in main.o 
    "boost::log::v2s_mt_posix::aux::once_block_sentry::commit()", referenced from: 
     boost::log::v2s_mt_posix::aux::lazy_singleton<boost::log::v2s_mt_posix::sources::aux::logger_singleton<SLogger>, boost::shared_ptr<boost::log::v2s_mt_posix::sources::aux::logger_holder<boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel> > > >::get() in main.o 
    "boost::log::v2s_mt_posix::aux::once_block_sentry::rollback()", referenced from: 
     boost::log::v2s_mt_posix::aux::once_block_sentry::~once_block_sentry() in main.o 
    "boost::log::v2s_mt_posix::aux::default_attribute_names::severity()", referenced from: 
     boost::log::v2s_mt_posix::sources::basic_severity_logger<boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>, ESeverityLevel>::basic_severity_logger() in main.o 
     boost::log::v2s_mt_posix::sources::basic_severity_logger<boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>, ESeverityLevel>::basic_severity_logger(boost::log::v2s_mt_posix::sources::basic_severity_logger<boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>, ESeverityLevel> const&) in main.o 
    "boost::log::v2s_mt_posix::aux::unhandled_exception_count()", referenced from: 
     boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel> >::~record_pump() in main.o 
     boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>&, boost::log::v2s_mt_posix::record&) in main.o 
    "boost::log::v2s_mt_posix::aux::attach_attribute_name_info(boost::exception&, boost::log::v2s_mt_posix::attribute_name const&)", referenced from: 
     boost::log::v2s_mt_posix::value_extractor<ESeverityLevel, boost::log::v2s_mt_posix::fallback_to_none, tag::severity>::operator()(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute_value_set const&) const in main.o 
    "boost::log::v2s_mt_posix::core::set_filter(boost::log::v2s_mt_posix::filter const&)", referenced from: 
     __ZL13gvLoggingInitPKc in main.o 
    "boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&)", referenced from: 
     boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, ESeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, ESeverityLevel const> const&) in main.o 
    "boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&)", referenced from: 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::push_record_unlocked(boost::log::v2s_mt_posix::record&&) in main.o 
    "boost::log::v2s_mt_posix::core::add_global_attribute(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute const&)", referenced from: 
     __ZL13gvLoggingInitPKc in main.o 
    "boost::log::v2s_mt_posix::core::get()", referenced from: 
     __ZL13gvLoggingInitPKc in main.o 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::basic_logger() in main.o 
     boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model>::basic_logger(boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<ESeverityLevel>, boost::log::v2s_mt_posix::sources::single_thread_model> const&) in main.o 
    "boost::log::v2s_mt_posix::sources::aux::global_storage::get_or_init(std::type_info const&, boost::shared_ptr<boost::log::v2s_mt_posix::sources::aux::logger_holder_base> (*)())", referenced from: 
     boost::log::v2s_mt_posix::sources::aux::logger_singleton<SLogger>::init_instance() in main.o 
    "boost::log::v2s_mt_posix::sources::aux::get_severity_level()", referenced from: 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::set_value(ESeverityLevel) in main.o 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::impl::dispatch(boost::log::v2s_mt_posix::type_dispatcher&) in main.o 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::impl::detach_from_thread() in main.o 
    "boost::log::v2s_mt_posix::sources::aux::throw_odr_violation(std::type_info const&, std::type_info const&, boost::log::v2s_mt_posix::sources::aux::logger_holder_base const&)", referenced from: 
     boost::log::v2s_mt_posix::sources::aux::logger_singleton<SLogger>::init_instance() in main.o 
    "boost::log::v2s_mt_posix::attribute::impl::operator delete(void*, unsigned long)", referenced from: 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::severity_level() in main.o 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::impl::~impl() in main.o 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::impl::detach_from_thread() in main.o 
     boost::log::v2s_mt_posix::attributes::attribute_value_impl<ESeverityLevel>::~attribute_value_impl() in main.o 
     boost::log::v2s_mt_posix::attribute_value::impl::~impl() in main.o 
     boost::log::v2s_mt_posix::attribute::impl::~impl() in main.o 
     boost::log::v2s_mt_posix::attributes::current_thread_id::current_thread_id() in main.o 
     ... 
    "boost::log::v2s_mt_posix::attribute::impl::operator new(unsigned long)", referenced from: 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::severity_level() in main.o 
     boost::log::v2s_mt_posix::sources::aux::severity_level<ESeverityLevel>::impl::detach_from_thread() in main.o 
     boost::log::v2s_mt_posix::attributes::current_thread_id::current_thread_id() in main.o 
     boost::log::v2s_mt_posix::attributes::current_thread_id::impl::detach_from_thread() in main.o 
     boost::log::v2s_mt_posix::attributes::constant<boost::log::v2s_mt_posix::aux::id<boost::log::v2s_mt_posix::aux::process> >::constant(boost::log::v2s_mt_posix::aux::id<boost::log::v2s_mt_posix::aux::process>&&) in main.o 
     boost::log::v2s_mt_posix::attributes::constant<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::constant(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) in main.o 
     boost::log::v2s_mt_posix::attributes::basic_clock<boost::log::v2s_mt_posix::attributes::local_time_traits>::basic_clock() in main.o 
     ... 
    "boost::system::system_category()", referenced from: 
     ___cxx_global_var_init2 in main.o 
    "boost::system::generic_category()", referenced from: 
     ___cxx_global_var_init in main.o 
     ___cxx_global_var_init1 in main.o 
    "boost::log::v2s_mt_posix::attribute_value_set::end() const", referenced from: 
     boost::log::v2s_mt_posix::value_extractor<ESeverityLevel, boost::log::v2s_mt_posix::fallback_to_none, tag::severity>::operator()(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute_value_set const&) const in main.o 
    "boost::log::v2s_mt_posix::attribute_value_set::find(boost::log::v2s_mt_posix::attribute_name) const", referenced from: 
     boost::log::v2s_mt_posix::value_extractor<ESeverityLevel, boost::log::v2s_mt_posix::fallback_to_none, tag::severity>::operator()(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute_value_set const&) const in main.o 
    "boost::log::v2s_mt_posix::aux::once_block_sentry::enter_once_block() const", referenced from: 
     boost::log::v2s_mt_posix::aux::once_block_sentry::executed() const in main.o 
    "boost::log::v2s_mt_posix::core::get_logging_enabled() const", referenced from: 
     __ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_15severity_loggerI14ESeverityLevelEENS2_19single_thread_modelENS2_8featuresIJNS2_8severityIS5_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEENS1_6recordERKT_ in 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) 

    "clang++" -o "bin/clang-darwin-4.2.1/debug/foghorn" "bin/clang-darwin-4.2.1/debug/src/main/cpp/complement.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/degenerate.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/fastq.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/fastq_reader.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/interleave.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/interval_reader.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/interval_reader_test_tool.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/main.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/oligo_designer.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/reference_reader.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/reference_reader_test_tool.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/sequence_utils.o" "bin/clang-darwin-4.2.1/debug/src/main/cpp/tool.o" -lboost_log -lboost_program_options -g -std=c++11 -stdlib=libc++ 

...failed clang-darwin.link bin/clang-darwin-4.2.1/debug/foghorn... 
...failed updating 1 target... 
...updated 13 targets... 

ответ

16

Я была такая же проблема и в моем случае проблема в том, что я BOOST скомпилирован только с динамическим LIBS , и забыл определить BOOST_ALL_DYN_LINK.

http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/rationale/namespace_mangling.html

В качестве теста, попробуйте скомпилировать

http://www.boost.org/doc/libs/1_54_0/libs/log/example/doc/tutorial_fmt_stream.cpp

(#include <boost/log/support/date_time.hpp> должен быть добавлен, например, сломана.)

, а также добавить #define BOOST_LOG_DYN_LINK

I может скомпилировать пример с g++ tutorial_fmt_stream.cpp -Wall -L$BOOST/lib/ -I $BOOST/include/ -pthread -lboost_system -lboost_log_setup -lboost_log -lboost_date_time -lboost_thread -lrt -lboost_filesystem

+2

Ты спас свой день. спасибо – Mert

2

У меня была такая же проблема, что и сложный путь связи. Сообщение показывает, что пытается связать со статическими библиотеками (.... v2s ...), но компоновщик дает только динамические библиотеки (потому что это глупо).

Ваша сборка Boost может генерировать файлы .so и .a, а gcc запутывается, когда оба присутствуют.

У меня была библиотека, построенная с использованием CMake, которая использует статические библиотеки Boost. Если вы связываете эту библиотеку с программой с использованием потока Makefile, программа также должна указать те же самые статические библиотеки Boost. Однако опция -l для компоновщика нечеткая, а не ваш друг здесь. Если вы создали Boost для статических (.a) и динамических (.so) выходов, тогда компоновщик сначала выберет динамические (.so) файлы, если вы просто используете опцию -l.

Обходной путь заключается в том, чтобы не использовать параметры -L и -l, чтобы найти статические библиотеки Boost (поскольку это не удастся), но указать полные пути к библиотекам Boost. Например,

gcc .... -L/opt/boost_1.55/lib -lboost_log 

изменение

gcc .... /opt/boost_1.55/lib/libboost_log.a 

Другой вариант, чтобы указать слово -static для GCC, но это требует, чтобы все библиотеки статичным, которые, вероятно, не будет работать, если вы используете что-нибудь, кроме увеличить (скажем, библиотеку librt.so).

+1

еще один вариант, если вы оба и никогда не планируете динамически связывать динамику: 'sudo rm -f/usr/local/lib/libboost _ *. dylib' –

4

Если вы используете cmake управлять подталкивание, просто не забудьте что-то вроде:

add_definitions(-DBOOST_LOG_DYN_LINK) 

в вашем CMakeLists.txt

+0

Другая проблема, но это исправило это для меня. –

0

Если вы используете

void boost::log::v2s_mt_posix::init_from_stream<char>(std::basic_istream<char, std::char_traits<char> >&) 

функции , вам необходимо соединить

libboost_log_setup.a