编译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
相关产品推荐
相关产品推荐

