Build gRPC shared against abseil static: undefined reference to nan@@GLIBC_2.2.5 in `charconv.cc` (`absl_strings`) on Linux
- 主要語言
- C++
- 星號
- 18.1k
- 分支
- 3.2k
- 平均合併
- 20 小時 36 分鐘
- 30 天內合併 PR
- 1
描述
**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:
```cmake
find_library(LIBM m)
absl_cc_library(
NAME
strings
...
LINKOPTS
$<$:-lm>
...
```
貢獻指南
研究方向
The issue is in absl/strings/charconv.cc, which uses `nan` from libm. The CMakeLists.txt for the absl_strings library needs to link to libm when built statically. Start by examining absl/strings/CMakeLists.txt and the absl_cc_library macro. Understand how LINKOPTS are propagated. The fix likely involves adding `-lm` to the link options for the strings target. Test by building abseil statically and then building gRPC shared against it to verify the undefined reference is resolved.
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- cmake, cpp
- 領域
- build-system
- Issue 類型
- 缺陷
- 難度
- 3/5
- 預估耗時
- 1-2 天
- 活躍度
- 停滯
- 描述清晰度
- 描述清楚
- 新手友好度
- 40/100