You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译OpenTelemetry C++报错:未定义absl::lts_20220623::variant_internal引用

问题:g编译OpenTelemetry C测试代码时出现Abseil未定义引用错误

已通过OpenTelemetry C源码的CMake构建并安装了相关库,但使用以下g命令编译测试代码时,出现Abseil相关的未定义引用错误:

g++ -o test test.cc -lopentelemetry_trace -lopentelemetry_exporter_otlp_grpc -lopentelemetry_resources -lopentelemetry_common

错误日志如下:

[root@OS otlp]# g++ -o test test.cc  -lopentelemetry_trace -lopentelemetry_exporter_otlp_grpc -lopentelemetry_resources -lopentelemetry_common
/usr/bin/ld: /usr/local/lib64/libopentelemetry_trace.a(tracer.cc.o): in function `opentelemetry::v1::nostd::shared_ptr<opentelemetry::v1::trace::Span>& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<opentelemetry::v1::nostd::shared_ptr<opentelemetry::v1::trace::Span>&>()':
tracer.cc:(.text._ZN4absl12lts_2022062316variant_internal26TypedThrowBadVariantAccessIRN13opentelemetry2v15nostd10shared_ptrINS4_5trace4SpanEEEEET_v[_ZN4absl12lts_2022062316variant_internal26TypedThrowBadVariantAccessIRN13opentelemetry2v15nostd10shared_ptrINS4_5trace4SpanEEEEET_v]+0x5): undefined reference to `absl::lts_20220623::variant_internal::ThrowBadVariantAccess()'
/usr/bin/ld: /usr/local/lib64/libopentelemetry_trace.a(tracer.cc.o): in function `opentelemetry::v1::trace::SpanContext const& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<opentelemetry::v1::trace::SpanContext const&>()':
tracer.cc:(.text._ZN4absl12lts_2022062316variant_internal26TypedThrowBadVariantAccessIRKN13opentelemetry2v15trace11SpanContextEEET_v[_ZN4absl12lts_2022062316variant_internal26TypedThrowBadVariantAccessIRKN13opentelemetry2v15trace11SpanContextEEET_v]+0x5): undefined reference to `absl::lts_20220623::variant_internal::ThrowBadVariantAccess()'
/usr/bin/ld: /usr/local/lib64/libopentelemetry_trace.a(tracer.cc.o): in function `opentelemetry::v1::context::Context const& absl::lts_2022062316variant_internal26TypedThrowBadVariantAccess<opentelemetry::v1::context::Context const&>()':
tracer.cc:(.text._ZN4absl12lts_2022062316variant_internal26TypedThrowBadVariantAccessIRKN13opentelemetry2v17context7ContextEEET_v[_ZN4absl12lts_2022062316variant_internal26TypedThrowBadVariantAccessIRKN13opentelemetry2v17context7ContextEEET_v]+0x5): undefined reference to `absl::lts_20220623::variant_internal::ThrowBadVariantAccess()'
/usr/bin/ld: /usr/local/lib64/libopentelemetry_exporter_otlp_g

已手动编译安装Abseil库,但不清楚如何在g++命令中引入Abseil库以解决该问题。


解决方案

方法1:直接在g++命令中添加Abseil依赖库

错误来自Abseil的variant模块,需链接对应的Abseil库。在原g++命令末尾添加Abseil相关库:

g++ -o test test.cc -lopentelemetry_trace -lopentelemetry_exporter_otlp_grpc -lopentelemetry_resources -lopentelemetry_common -labsl_variant -labsl_bad_variant_access

如果安装Abseil时生成了pkg-config配置文件,也可以用以下命令自动获取链接参数:

g++ -o test test.cc -lopentelemetry_trace -lopentelemetry_exporter_otlp_grpc -lopentelemetry_resources -lopentelemetry_common $(pkg-config --libs absl_variant absl_bad_variant_access)

方法2:用CMake管理编译(更推荐)

既然已经用CMake构建了OpenTelemetry,直接用CMake管理测试代码可避免手动链接的繁琐。创建CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
project(test_otlp)

find_package(OpenTelemetry REQUIRED COMPONENTS trace exporter_otlp_grpc resources common)
find_package(absl REQUIRED COMPONENTS variant bad_variant_access)

add_executable(test test.cc)
target_link_libraries(test PRIVATE
  opentelemetry::trace
  opentelemetry::exporter_otlp_grpc
  opentelemetry::resources
  opentelemetry::common
  absl::variant
  absl::bad_variant_access
)

然后执行构建:

mkdir build && cd build
cmake ..
make

方法3:指定Abseil库的搜索路径

如果g++找不到Abseil库,用-L参数指定库的安装路径(默认是/usr/local/lib64或/usr/local/lib,根据实际安装路径调整):

g++ -o test test.cc -L/usr/local/lib64 -lopentelemetry_trace -lopentelemetry_exporter_otlp_grpc -lopentelemetry_resources -lopentelemetry_common -labsl_variant -labsl_bad_variant_access

内容的提问来源于stack exchange,提问作者Ricky Du

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:57:26