Build gRPC shared against abseil static: undefined reference to nan@@GLIBC_2.2.5 in `charconv.cc` (`absl_strings`) on Linux
Describe the bug
Undefined reference to nan in charconv.cc (absl_strings) while building gRPC shared against abseil static on Linux with gcc-10:
[ 98%] Linking CXX shared library ../lib/libgrpc++.so
/usr/bin/ld: /home/conan/w/BuildSingleReference/.conan/data/abseil/20211102.0/_/_/package/b173bbda18164d49a449ffadc1c9e817f49e819d/lib/libabsl_strings.a(charconv.cc.o): undefined reference to symbol 'nan@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
Steps to reproduce the bug
- Linux and C++ lib without nan implementation in
std::namespace I guess. - Build abseil static
- Build gRPC shared
What version of Abseil are you using?
20211102.0
What operating system and version are you using
Some linux distribution, ubuntu 20 I guess (a docker of a CI I don't control so sorry not much information).
What compiler and version are you using?
gcc-10
What build system are you using?
CMake
Additional context
I think that absl_strings may depend on libm instead of libstdc++ only, due to https://github.com/abseil/abseil-cpp/blob/fbbb5865a562c9a9167d71c1cf56b82025a8f065/absl/strings/charconv.cc#L86-L91
So I guess it's sufficient to link directly to libm in case of, and add this in CMakeLists of absl_strings, so that libm is properly propagated in CMake imported target if static:
find_library(LIBM m)
absl_cc_library(
NAME
strings
...
LINKOPTS
$<$<BOOL:${LIBM}>:-lm>
...