abseil / abseil/abseil-cpp

Build gRPC shared against abseil static: undefined reference to nan@@GLIBC_2.2.5 in `charconv.cc` (`absl_strings`) on Linux

Đang mở
#1,100 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
C++
Star
18.1k
Fork
3.2k
Merge trung bình
20 giờ 36 phút
Pull request đã merge (30 ngày)
1

Mô tả

**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>
...
```

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
cmake, cpp
Lĩnh vực
build-system
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
40/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.