scylladb/seastar

undefined reference to `seastar::logger::failed_to_log

robinchrist opened this issue · 3 comments

When building a very simple test application

# Make sure we use a relatively recent version - 3.27 is Nov 2023
cmake_minimum_required(VERSION 3.27)

project ("Kataklysmos")

find_package (Seastar REQUIRED)

add_executable (my_app
  src/main.cpp)

target_link_libraries (my_app PUBLIC Seastar::seastar)
#include <seastar/core/app-template.hh>
#include <seastar/core/seastar.hh>
#include <seastar/util/log.hh>

using namespace seastar;
logger applog("app");

int main(int argc, char** argv) {
    seastar::app_template app;
    app.run(argc, argv, [] () -> future<> {
        applog.info("Hello world!");
        return make_ready_future<>();
    });
}

I get the following linker error:

[3/3] Linking CXX executable my_app
FAILED: my_app 
: && /usr/bin/c++ -O3 -DNDEBUG  CMakeFiles/my_app.dir/src/main.cpp.o -o my_app  /data/dev/Kataklysmos/external/seastar/build/release/libseastar.a  /usr/lib/x86_64-linux-gnu/libboost_program_options.so  /usr/lib/x86_64-linux-gnu/libboost_thread.so  /usr/lib/x86_64-linux-gnu/libboost_chrono.so  /usr/lib/x86_64-linux-gnu/libboost_date_time.so  /usr/lib/x86_64-linux-gnu/libboost_atomic.so  /usr/lib/x86_64-linux-gnu/libcares.so  /usr/lib/x86_64-linux-gnu/libfmt.so.9.1.0  /usr/lib/x86_64-linux-gnu/liblz4.so  -ldl  /usr/lib/x86_64-linux-gnu/libgnutls.so  -latomic  /usr/lib/x86_64-linux-gnu/libsctp.so  /usr/lib/x86_64-linux-gnu/libprotobuf.so  /usr/lib/x86_64-linux-gnu/libyaml-cpp.so  /usr/lib/x86_64-linux-gnu/libhwloc.so  /usr/lib/x86_64-linux-gnu/liburing.so  /usr/lib/x86_64-linux-gnu/libnuma.so && :
/usr/bin/ld: CMakeFiles/my_app.dir/src/main.cpp.o: in function `std::_Function_handler<seastar::future<void> (), main::{lambda()#1}>::_M_invoke(std::_Any_data const&) [clone .cold]':
main.cpp:(.text.unlikely+0x40): undefined reference to `seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v9::basic_string_view<char>, seastar::internal::source_location)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

Seastar was configured with

sudo ./install-dependencies.sh
./configure.py --mode=release --enable-dpdk
ninja -C build/release

with the Valgrind fix from #2180
Tested b74a027 and cd8a913

With Clang (Seastar itself build with default GCC) I get the error:


/data/dev/Kataklysmos/src/main.cpp:32:21: error: call to consteval function 'seastar::logger::format_info<>::format_info<char[13], 0>' is not a constant expression
        applog.info("Hello world!");
                    ^
/data/dev/Kataklysmos/external/seastar/include/seastar/util/log.hh:141:58: note: non-constexpr function 'current' cannot be used in a constant expression
                           compat::source_location loc = compat::source_location::current()) noexcept
                                                         ^
/data/dev/Kataklysmos/external/seastar/include/seastar/util/source_location-compat.hh:50:21: note: declared here
    source_location current(const char* file = __builtin_FILE(), const char* func = __builtin_FUNCTION(), int line = __builtin_LINE(), int col = 0) noexcept {
                    ^
1 warning and 1 error generated.
ninja: build stopped: subcommand failed.

Same result when cooking fmt and upgrading to 10.2.1

robin@WS-DA-7773X:/data/dev/Kataklysmos/build$ ninja
[3/3] Linking CXX executable my_app
FAILED: my_app 
: && /usr/bin/c++ -O3 -DNDEBUG  CMakeFiles/my_app.dir/src/main.cpp.o -o my_app  /data/dev/Kataklysmos/external/seastar/build/release/libseastar.a  /usr/lib/x86_64-linux-gnu/libboost_program_options.so  /usr/lib/x86_64-linux-gnu/libboost_thread.so  /usr/lib/x86_64-linux-gnu/libboost_chrono.so  /usr/lib/x86_64-linux-gnu/libboost_date_time.so  /usr/lib/x86_64-linux-gnu/libboost_atomic.so  /usr/lib/x86_64-linux-gnu/libcares.so  /data/dev/Kataklysmos/external/seastar/build/release/_cooking/installed/lib/libfmt.a  /usr/lib/x86_64-linux-gnu/liblz4.so  -ldl  /usr/lib/x86_64-linux-gnu/libgnutls.so  -latomic  /usr/lib/x86_64-linux-gnu/libsctp.so  /usr/lib/x86_64-linux-gnu/libprotobuf.so  /usr/lib/x86_64-linux-gnu/libyaml-cpp.so  /usr/lib/x86_64-linux-gnu/libhwloc.so  /usr/lib/x86_64-linux-gnu/liburing.so  /usr/lib/x86_64-linux-gnu/libnuma.so && :
/usr/bin/ld: CMakeFiles/my_app.dir/src/main.cpp.o: in function `std::_Function_handler<seastar::future<void> (), main::{lambda()#1}>::_M_invoke(std::_Any_data const&) [clone .cold]':
main.cpp:(.text.unlikely+0x40): undefined reference to `seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, seastar::internal::source_location)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

Seems to be somehow related to boost?

./configure.py --mode=release --cook fmt --cook Boost --cook valgrind --c++-standard=20 --enable-dpdk

Works at least (with the Valgrind fix).
I haven't had the nerve to test whether removing --cook Boost will fix the issue...

@robinchrist hi Robin, so there are two issues here:

  1. undefined reference to seastar::logger::failed_to_log()` with GCC
  2. call to consteval function 'seastar::logger::format_info<>::format_info<char[13], 0>' is not a constant express with Clang

may i learn the version of GCC and the version of Clang which you are using? have you tried to build both you application and Seastar with Clang?

the first issue is a mysterious to me. because this symbol should be included in libseastar.a, could you paste the output of

$ nm -C build/release/libseastar.a | grep failed_to_log
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
0000000000001200 T seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)
0000000000003e50 t seastar::logger::lambda_log_writer<seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)::$_0>::operator()(seastar::internal::log_buf::inserter_iterator)
0000000000003e20 t seastar::logger::lambda_log_writer<seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)::$_0>::~lambda_log_writer()
00000000000012a0 t seastar::logger::lambda_log_writer<seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)::$_0>::~lambda_log_writer()
00000000000000a0 d typeinfo for seastar::logger::lambda_log_writer<seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)::$_0>
0000000000000079 r typeinfo name for seastar::logger::lambda_log_writer<seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)::$_0>
0000000000000078 d vtable for seastar::logger::lambda_log_writer<seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)::$_0>
                 U seastar::logger::failed_to_log(std::__exception_ptr::exception_ptr, fmt::v10::basic_string_view<char>, std::source_location)