Good morning, I am trying to create a logger that uses Boost Log. I was successful getting my code to compile with 1.63.0, so I know that I am not too far off of the mark. cmake/make throws a linking issues whenever I attempt to create a sink: typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink; boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink
();
or create file sink
logging::add_file_log
(
keywords::file_name = log_specs.log_file,
keywords::rotation_size = 10 * 1024 * 1024,
keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0,
0),
keywords::filter = min_severity || severity >= file_severity,
keywords::format =
(
expr::stream
<< expr::format_date_timeboost::posix_time::ptime("TimeStamp",
"%Y-%m-%d_%H:%M:%S.%f")
<< ": [" << severity << "]"
<< expr::smessage
),
keywords::auto_flush = true //flush to file..
);
My code will compile 95% and then produce the following:
CMakeFiles/main.dir/src/Logger.cpp.o: In function
`boost::enable_if_c<(boost::log::v2_mt_posix::aux::is_character_type (boost::log::v2_mt_posix::record_view const&, boost::recursive_mutex&,
boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>&)': Logger.cpp:(.text._ZN5boost3log11v2_mt_posix5sinks30basic_formatting_sink_frontendIcE11feed_recordINS_15recursive_mutexENS2_26basic_text_ostream_backendIcEEEEvRKNS1_11record_viewERT_RT0_[_ZN5boost3log11v2_mt_posix5sinks30basic_formatting_sink_frontendIcE11feed_recordINS_15recursive_mutexENS2_26basic_text_ostream_backendIcEEEEvRKNS1_11record_viewERT_RT0_]+0x141):
undefined reference to
`boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>::consume(boost::log::v2_mt_posix::record_view
const&, std::__cxx11::basic_string (boost::log::v2_mt_posix::record_view const&,
boost::log::v2_mt_posix::aux::fake_mutex&,
boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>&)': Logger.cpp:(.text._ZN5boost3log11v2_mt_posix5sinks30basic_formatting_sink_frontendIcE11feed_recordINS1_3aux10fake_mutexENS2_26basic_text_ostream_backendIcEEEEvRKNS1_11record_viewERT_RT0_[_ZN5boost3log11v2_mt_posix5sinks30basic_formatting_sink_frontendIcE11feed_recordINS1_3aux10fake_mutexENS2_26basic_text_ostream_backendIcEEEEvRKNS1_11record_viewERT_RT0_]+0x141):
undefined reference to
`boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>::consume(boost::log::v2_mt_posix::record_view
const&, std::__cxx11::basic_string
On 9/15/20 5:34 PM, Karmethia Thompson via Boost wrote:
Good morning,
I am trying to create a logger that uses Boost Log. I was successful getting my code to compile with 1.63.0, so I know that I am not too far off of the mark. cmake/make throws a linking issues whenever I attempt to create a sink:
[snip]
Can someone please help? I have tried everything from trying to dynamically and statically link. I've added both "log" and "log_setup" to the find_packages in cmake and have also explicitly specified the locations of those libraries as well.
The error messages indicate you're missing symbols defined in libboost_log. I think you either didn't specify the library to link with, or you might be affected by this bug: https://gitlab.kitware.com/cmake/cmake/-/issues/20638 https://github.com/boostorg/log/issues/46 The solution is to use target_link_libraries to explicitly link with libboost_log, e.g.: target_link_libraries(${MY_TARGET} boost_log)
Andrey thanks for your reply. I tried that as well without success. My cmake file is below: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DBOOST_LOG_DYN_LINK=1) ## Common parameters. # Set common path variables. (YOURS MAY BE DIFFERENT) set(BOOST_ROOT "$ENV{BOOST_ROOT}") set(ARMADILLO_HOME "$ENV{ARMADILLO_ROOT}") include_directories (${ARMADILLO_HOME}/include) link_directories (${ARMADILLO_HOME}/lib64) #SET(CMAKE_VERBOSE_MAKEFILE ON) # Set the path to Boost #SET(Boost_USE_STATIC_LIBS ON) #SET(Boost_USE_MULTITHREADED ON) find_package (Boost COMPONENTS log log_setup system thread filesystem date_time REQUIRED) include_directories (${Boost_INCLUDE_DIRS}) link_directories (${Boost_LIBRARY_DIRS}) #link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/modules") # Retrieve the list of source files. file (GLOB SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) file (GLOB MODULE_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/*.cpp) add_executable (main main.cpp ${SOURCE} ${MODULE_SOURCE} ) target_link_libraries(main boost_log) target_link_libraries (main ${Boost_LIBRARIES} -lpthread) On Tue, Sep 15, 2020 at 12:14 PM Andrey Semashev via Boost < boost@lists.boost.org> wrote:
On 9/15/20 5:34 PM, Karmethia Thompson via Boost wrote:
Good morning,
I am trying to create a logger that uses Boost Log. I was successful getting my code to compile with 1.63.0, so I know that I am not too far off of the mark. cmake/make throws a linking issues whenever I attempt to create a sink:
[snip]
Can someone please help? I have tried everything from trying to dynamically and statically link. I've added both "log" and "log_setup" to the find_packages in cmake and have also explicitly specified the locations of those libraries as well.
The error messages indicate you're missing symbols defined in libboost_log.
I think you either didn't specify the library to link with, or you might be affected by this bug:
https://gitlab.kitware.com/cmake/cmake/-/issues/20638 https://github.com/boostorg/log/issues/46
The solution is to use target_link_libraries to explicitly link with libboost_log, e.g.:
target_link_libraries(${MY_TARGET} boost_log)
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
-- Karmethia Thompson Applied Mathematics, PhD
On 9/15/20 7:44 PM, Karmethia Thompson via Boost wrote:
Andrey thanks for your reply. I tried that as well without success. My cmake file is below:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DBOOST_LOG_DYN_LINK=1)
## Common parameters. # Set common path variables. (YOURS MAY BE DIFFERENT) set(BOOST_ROOT "$ENV{BOOST_ROOT}")
set(ARMADILLO_HOME "$ENV{ARMADILLO_ROOT}") include_directories (${ARMADILLO_HOME}/include) link_directories (${ARMADILLO_HOME}/lib64) #SET(CMAKE_VERBOSE_MAKEFILE ON)
# Set the path to Boost #SET(Boost_USE_STATIC_LIBS ON) #SET(Boost_USE_MULTITHREADED ON) find_package (Boost COMPONENTS log log_setup system thread filesystem date_time REQUIRED) include_directories (${Boost_INCLUDE_DIRS}) link_directories (${Boost_LIBRARY_DIRS}) #link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/modules")
# Retrieve the list of source files. file (GLOB SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) file (GLOB MODULE_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/*.cpp)
add_executable (main main.cpp ${SOURCE} ${MODULE_SOURCE} ) target_link_libraries(main boost_log) target_link_libraries (main ${Boost_LIBRARIES} -lpthread)
I'm not sure, but I think the above would generate incorrect order of libraries in the linker command line. You need to ensure that boost_log comes after boost_log_setup, and their dependencies come after still. So it should be: boost_log_setup, boost_log, boost_thread, boost_filesystem, boost_system, boost_date_time, pthread. You can see the linker command line if you add VERBOSE=1 environment variable before make. Also, you don't need to specify -l in target_link_libraries (i.e. you should specify pthread instead of -lpthread). Also, please don't top-post.
On 9/15/20 8:02 PM, Andrey Semashev wrote:
On 9/15/20 7:44 PM, Karmethia Thompson via Boost wrote:
Andrey thanks for your reply. I tried that as well without success. My cmake file is below:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DBOOST_LOG_DYN_LINK=1)
## Common parameters. # Set common path variables. (YOURS MAY BE DIFFERENT) set(BOOST_ROOT "$ENV{BOOST_ROOT}")
set(ARMADILLO_HOME "$ENV{ARMADILLO_ROOT}") include_directories (${ARMADILLO_HOME}/include) link_directories (${ARMADILLO_HOME}/lib64) #SET(CMAKE_VERBOSE_MAKEFILE ON)
# Set the path to Boost #SET(Boost_USE_STATIC_LIBS ON) #SET(Boost_USE_MULTITHREADED ON) find_package (Boost COMPONENTS log log_setup system thread filesystem date_time REQUIRED) include_directories (${Boost_INCLUDE_DIRS}) link_directories (${Boost_LIBRARY_DIRS}) #link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/modules")
# Retrieve the list of source files. file (GLOB SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) file (GLOB MODULE_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/*.cpp)
add_executable (main main.cpp ${SOURCE} ${MODULE_SOURCE} ) target_link_libraries(main boost_log) target_link_libraries (main ${Boost_LIBRARIES} -lpthread)
I'm not sure, but I think the above would generate incorrect order of libraries in the linker command line. You need to ensure that boost_log comes after boost_log_setup, and their dependencies come after still. So it should be: boost_log_setup, boost_log, boost_thread, boost_filesystem, boost_system, boost_date_time, pthread.
You can see the linker command line if you add VERBOSE=1 environment variable before make.
Also, you don't need to specify -l in target_link_libraries (i.e. you should specify pthread instead of -lpthread).
Also, please don't top-post.
And I'm assuming you're linking with shared libraries of Boost. If not, you need to *not* define BOOST_LOG_DYN_LINK.
On 9/15/20 7:44 PM, Karmethia Thompson via Boost wrote:
Andrey thanks for your reply. I tried that as well without success. My cmake file is below:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DBOOST_LOG_DYN_LINK=1)
## Common parameters. # Set common path variables. (YOURS MAY BE DIFFERENT) set(BOOST_ROOT "$ENV{BOOST_ROOT}")
set(ARMADILLO_HOME "$ENV{ARMADILLO_ROOT}") include_directories (${ARMADILLO_HOME}/include) link_directories (${ARMADILLO_HOME}/lib64) #SET(CMAKE_VERBOSE_MAKEFILE ON)
# Set the path to Boost #SET(Boost_USE_STATIC_LIBS ON) #SET(Boost_USE_MULTITHREADED ON) find_package (Boost COMPONENTS log log_setup system thread filesystem date_time REQUIRED) include_directories (${Boost_INCLUDE_DIRS}) link_directories (${Boost_LIBRARY_DIRS}) #link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/modules")
# Retrieve the list of source files. file (GLOB SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) file (GLOB MODULE_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/*.cpp)
add_executable (main main.cpp ${SOURCE} ${MODULE_SOURCE} ) target_link_libraries(main boost_log) target_link_libraries (main ${Boost_LIBRARIES} -lpthread)
It likely doesn't really solve your problem, but don't use include_directories, link_directories but the target_* variants of that. Similar don't use Boost_INCLUDE_DIRS, Boost_LIBRARIES, ... but use the targets provided. I.e. Boost::log This will make your code much cleaner, shorter, hence easier to maintain and maybe already solves your problem. Maybe including Boost::log_setup before Boost::log in your target_link_libraries solves the problem. Please try that and if that fails run "make VERBOSE=1" and post the relevant linker line.
Andrey Semashev wrote:
I'm not sure, but I think the above would generate incorrect order of libraries in the linker command line. You need to ensure that boost_log comes after boost_log_setup, and their dependencies come after still.
CMake automatically orders libraries so that the dependencies come after. Unfortunately, FindBoost has a bug and declares log as depending on log_setup, rather than vice versa. https://github.com/Kitware/CMake/blob/bdcde7762c71cd27fcba6dc1a3efe12fa7a09f... No matter how you order the libraries in target_link_libraries, the order between these two will never be correct. Not sure if this is the problem here though.
participants (4)
-
Alexander Grund
-
Andrey Semashev
-
Karmethia Thompson
-
Peter Dimov