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分
- マージ済み PR(30日)
- 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>
...
```
コントリビューションガイド
調査の方向性
この問題は `nan` を libm から使用している absl/strings/charconv.cc にあります。absl_strings ライブラリの CMakeLists.txt は、静的にビルドする場合に libm とリンクする必要があります。まず absl/strings/CMakeLists.txt と absl_cc_library マクロを調べてください。LINKOPTS がどのように伝播されるかを理解してください。修正では、strings ターゲットのリンクオプションに `-lm` を追加することになる可能性があります。abseil を静的にビルドし、その後それに対して gRPC を共有ライブラリとしてビルドして、未定義参照が解決されることを確認してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- cmake, cpp
- 領域
- build-system
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 停滞
- 明瞭さ
- 明確に書かれている
- 初心者へのやさしさ
- 40/100