opentelemetry-cpp: Undefined reference error while building simple example

Describe your environment Describe any aspect of your environment relevant to the problem, including your platform, build system, version numbers of installed dependencies, etc. If you’re reporting a problem with a specific version of a library in this repo, please check whether the problem has been fixed on main branch. OS - SUSE Linux Enterprise Server 15 Installed opentelemetry-cpp[otlp-grpc] through vcpkg.

Steps to reproduce Describe exactly how to reproduce the error. Include a code sample if applicable. I ran a slightly modified version of the simple example given in the repository.

g++ trial.cpp -std=c++14 -I vcpkg/packages/opentelemetry-cpp_x64-linux/include/ && ./a.out
#include "opentelemetry/exporters/ostream/span_exporter_factory.h"
#include "opentelemetry/sdk/trace/simple_processor_factory.h"
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
#include "opentelemetry/trace/provider.h"



namespace trace_api      = opentelemetry::trace;
namespace trace_sdk      = opentelemetry::sdk::trace;
namespace trace_exporter = opentelemetry::exporter::trace;

namespace
{
void InitTracer()
{
  auto exporter  = trace_exporter::OStreamSpanExporterFactory::Create();
  auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
  std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
      trace_sdk::TracerProviderFactory::Create(std::move(processor));

  // Set the global trace provider
  trace_api::Provider::SetTracerProvider(provider);
}

void CleanupTracer()
{
  std::shared_ptr<opentelemetry::trace::TracerProvider> none;
  trace_api::Provider::SetTracerProvider(none);
}
}  // namespace

int main()
{
  // Removing this line will leave the default noop TracerProvider in place.
  InitTracer();

    auto provider = trace_api::Provider::GetTracerProvider();
    auto tracer = provider->GetTracer("foo_library");

  //create a span
    auto span = tracer->StartSpan("first-span");
    auto scope = tracer->WithActiveSpan(span);
    //inner ops
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    span->End();

    std::cout<<"Heloworld!"<<std::endl;
    CleanupTracer();
    return 0;
} 

What is the expected behavior? What did you expect to see? The program should compile without errors and execute.

What is the actual behavior? What did you see instead? The program passes syntax and lexical analysis , and fails during machine code generation, with the error

 /tmp/ccdjnFU7.o: In function `(anonymous namespace)::InitTracer()':
trial.cpp:(.text+0x1c5): undefined reference to `opentelemetry::v1::exporter::trace::OStreamSpanExporterFactory::Create()'
trial.cpp:(.text+0x1e3): undefined reference to `opentelemetry::v1::sdk::trace::SimpleSpanProcessorFactory::Create(std::unique_ptr<opentelemetry::v1::sdk::trace::SpanExporter, std::default_delete<opentelemetry::v1::sdk::trace::SpanExporter> >&&)'
trial.cpp:(.text+0x214): undefined reference to `opentelemetry::v1::sdk::trace::TracerProviderFactory::Create(std::unique_ptr<opentelemetry::v1::sdk::trace::SpanProcessor, std::default_delete<opentelemetry::v1::sdk::trace::SpanProcessor> >)'
collect2: error: ld returned 1 exit status 

Additional context Add any other context about the problem here.

About this issue

  • Original URL
  • State: open
  • Created a year ago
  • Comments: 30 (13 by maintainers)

Most upvoted comments

Could you try to use --debug-find-pkg=OpenSSL to find out why openssl can not be found?

Hey,given that I had issues with my previous CMakeLists.txt , I decided to start anew, trying to find proper methods to include the files.I ended up with something that kinda resembles the g++ include statement I was doing before, which doesnt seem sustainable. The previous method I was unable to set proper directories for including opentelemetry libs.Would appreciate some guidance.

Current CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(otel-test)

set(VCPKG_ROOT "/home/kmh/vcpkg/" CACHE PATH "Path to vcpkg root dir")

set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")

set(CMAKE_CXX_STANDARD 17)

set(OTEL_INCLUDE_DIR "${VCPKG_ROOT}/packages/opentelemetry-cpp_x64-linux/include/")

set(SOURCES test.cpp)

set(OTEL_LIBS_DIR "${VCPKG_ROOT}/installed/x64-linux/lib/")

add_executable(myexe ${SOURCES})


target_include_directories(myexe PRIVATE ${OTEL_INCLUDE_DIR})

link_directories(
    ${OTEL_LIBS_DIR}/opentelemetry_exporter_otlp_grpc.a
)

target_link_libraries(myexe
${OTEL_LIBS_DIR}/libopentelemetry_exporter_otlp_grpc_client.a
${OTEL_LIBS_DIR}/libgrpc++.a
${OTEL_LIBS_DIR}/libopentelemetry_exporter_otlp_grpc.a
${OTEL_LIBS_DIR}/libopentelemetry_otlp_recordable.a
${OTEL_LIBS_DIR}/libopentelemetry_proto.a
${OTEL_LIBS_DIR}/libopentelemetry_proto_grpc.a
${OTEL_LIBS_DIR}/libprotobuf.a
${OTEL_LIBS_DIR}/libopentelemetry_trace.a
${OTEL_LIBS_DIR}/libopentelemetry_logs.a
${OTEL_LIBS_DIR}/libopentelemetry_metrics.a
${OTEL_LIBS_DIR}/libopentelemetry_resources.a
${OTEL_LIBS_DIR}/libopentelemetry_common.a
${OTEL_LIBS_DIR}/libabsl_bad_variant_access.a
)

I still have some unresolved reference errors,however less than before.

[ 50%] Linking CXX executable myexe
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: /home/kmh/vcpkg/installed/x64-linux/lib//libopentelemetry_exporter_otlp_grpc.a(otlp_grpc_exporter.cc.o): in function `opentelemetry::v1::exporter::otlp::OtlpGrpcExporter::OtlpGrpcExporter(opentelemetry::v1::exporter::otlp::OtlpGrpcExporterOptions const&)':
otlp_grpc_exporter.cc:(.text+0x5af): undefined reference to `opentelemetry::v1::exporter::otlp::OtlpGrpcClient::MakeTraceServiceStub(opentelemetry::v1::exporter::otlp::OtlpGrpcExporterOptions const&)'
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: /home/kmh/vcpkg/installed/x64-linux/lib//libopentelemetry_exporter_otlp_grpc.a(otlp_grpc_exporter.cc.o): in function `opentelemetry::v1::exporter::otlp::OtlpGrpcExporter::Export(opentelemetry::v1::nostd::span<std::unique_ptr<opentelemetry::v1::sdk::trace::Recordable, std::default_delete<opentelemetry::v1::sdk::trace::Recordable> >, 18446744073709551615ul> const&)':
otlp_grpc_exporter.cc:(.text+0xa81): undefined reference to `opentelemetry::v1::exporter::otlp::OtlpGrpcClient::MakeClientContext(opentelemetry::v1::exporter::otlp::OtlpGrpcExporterOptions const&)'
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: otlp_grpc_exporter.cc:(.text+0xaa7): undefined reference to `opentelemetry::v1::exporter::otlp::OtlpGrpcClient::DelegateExport(opentelemetry::proto::collector::trace::v1::TraceService::StubInterface*, grpc::ClientContext*, opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest const&, opentelemetry::proto::collector::trace::v1::ExportTraceServiceResponse*)'
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: otlp_grpc_exporter.cc:(.text+0xafc): undefined reference to `grpc::ClientContext::~ClientContext()'
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: otlp_grpc_exporter.cc:(.text+0x1413): undefined reference to `opentelemetry::v1::exporter::otlp::grpc_utils::grpc_status_code_to_string(grpc::StatusCode)'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/myexe.dir/build.make:114: myexe] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:93: CMakeFiles/myexe.dir/all] Error 2
gmake: *** [Makefile:101: all] Error 2

I’m trying to run this sample otlp example given by you guys.

// #include "opentelemetry/exporters/ostream/span_exporter_factory.h"
// #include "opentelemetry/exporters/ostream/span_exporter.h"
#include "utils.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
#include "opentelemetry/sdk/trace/simple_processor_factory.h"
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
#include "opentelemetry/trace/provider.h"



namespace trace_api      = opentelemetry::trace;
namespace trace_sdk      = opentelemetry::sdk::trace;
// namespace trace_exporter = opentelemetry::exporter::trace;
namespace otlp      = opentelemetry::exporter::otlp;


namespace
{
opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts;
void InitTracer()
{
  // Create OTLP exporter instance
  auto exporter  = otlp::OtlpGrpcExporterFactory::Create(opts);
  auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
  std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
      trace_sdk::TracerProviderFactory::Create(std::move(processor));
  // Set the global trace provider
  trace_api::Provider::SetTracerProvider(provider);
}

void CleanupTracer()
{

  std::shared_ptr<opentelemetry::trace::TracerProvider> none;
  trace_api::Provider::SetTracerProvider(none);
}
}  // namespace

int main()
{
  // Removing this line will leave the default noop TracerProvider in place.
  InitTracer();

    auto provider = trace_api::Provider::GetTracerProvider();
    auto tracer = provider->GetTracer("foo_library");

  //create a span
    auto span = tracer->StartSpan("first-span");
    auto scope = tracer->WithActiveSpan(span);
    //inner ops
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    span->End();

    std::cout<<"Heloworld!"<<std::endl;
    CleanupTracer();
    return 0;
}

Please set CMAKE_TOOLCHAIN_FILE before project(otel-test) and use find_package(opentelemetry-cpp) to find otel-cpp and use target_link_libraries(<EXE> opentelemetry-cpp::trace opentelemetry-cpp::ostream_span_exporter opentelemetry-cpp::otlp_grpc_exporter) to import trace, ostream exporter and OTLP exporter.Do not include directories and link libraries manually.