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

将OpenTelemetry接入C++掷骰子应用时出现链接构建错误

解决OpenTelemetry接入C++掷骰子应用的链接错误

问题根源

你遇到的链接错误属于静态库依赖缺失+链接顺序不正确:

  • 错误中未定义的GetHandlerAndLevel()、GenerateRandomBuffer()等函数属于OpenTelemetry的common模块,但链接时未正确关联依赖
  • SpanExporter相关的类型引用缺失,说明trace核心库的依赖未被正确引入
  • 手动查找静态库的方式容易遗漏隐式依赖,且未遵循静态库的链接顺序规则

解决方案

方案1:使用官方CMake配置(推荐)

放弃手动查找库,利用OpenTelemetry提供的CMake配置自动处理所有依赖,修改你的CMakeLists.txt如下:

project(RollDiceServer)
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 17)
set(project_name roll-dice-server)

set(SOURCES
    main.cpp
)

add_executable(dice-server ${SOURCES})

# 配置Oatpp依赖
set(OATPP_ROOT ../oatpp)
find_library(OATPP_LIB NAMES liboatpp.a HINTS "${OATPP_ROOT}/build/src/" NO_DEFAULT_PATH)
if (NOT OATPP_LIB)
  message(SEND_ERROR "Did not find oatpp library ${OATPP_ROOT}/build/src")
endif()
include_directories(${OATPP_ROOT}/src)

# 引入OpenTelemetry官方CMake配置
set(OPENTELEMETRY_ROOT ../opentelemetry-cpp)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${OPENTELEMETRY_ROOT}/build)
find_package(opentelemetry-cpp REQUIRED COMPONENTS trace common resource ostream_exporter)

# 链接所有依赖库
target_link_libraries(dice-server PRIVATE
  ${OATPP_LIB}
  opentelemetry-cpp::trace
  opentelemetry-cpp::common
  opentelemetry-cpp::resource
  opentelemetry-cpp::ostream_exporter
)

方案2:修复手动链接的库与顺序

如果坚持手动管理库文件,需要补充缺失的API库并调整链接顺序:

  1. 添加查找OpenTelemetry API库:
find_library(OPENTELEMETRY_API_LIB NAMES libopentelemetry_api.a HINTS "${OPENTELEMETRY_ROOT}/build/api" NO_DEFAULT_PATH)
  1. 更新库存在性检查:
if(OPENTELEMETRY_API_LIB AND OPENTELEMETRY_COMMON_LIB AND OPENTELEMETRY_TRACE_LIB AND OPENTELEMETRY_EXPORTER_LIB AND OPENTELEMETRY_RESOURCE_LIB)
  message(STATUS "Found opentelemetry libraries")
else()
  message(SEND_ERROR "Did not find opentelemetry libraries")
endif()
  1. 按依赖顺序调整链接规则(被依赖的库放在最后):
target_link_libraries(dice-server PRIVATE
  ${OATPP_LIB}
  ${OPENTELEMETRY_EXPORTER_LIB}
  ${OPENTELEMETRY_TRACE_LIB}
  ${OPENTELEMETRY_RESOURCE_LIB}
  ${OPENTELEMETRY_COMMON_LIB}
  ${OPENTELEMETRY_API_LIB}
)

必要检查步骤

  • 确认编译OpenTelemetry时,BUILD_TRACE、BUILD_COMMON、BUILD_RESOURCE、BUILD_OSTREAM_EXPORTER等选项处于启用状态(默认开启)
  • 清理项目的build目录,重新执行cmake .. && cmake --build .完成构建

内容的提问来源于stack exchange,提问作者Prakash Narayana Maiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:05:53