open-telemetry / open-telemetry/opentelemetry-cpp

Unable to compile opentelemetry-cpp on linux and getting link error using cmake

Open
#3,494 7 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug Stale triage/needs-information
Dominant language
C++
Stars
1.4k
Forks
632
Avg merge
1d 13h
Merged PRs (30d)
75

Description

I am getting below link error while compiling opentelemetry-cpp

/usr/bin/ld: CMakeFiles/MyTelemetryProject.dir/main.cpp.o: in function InitMetrics()': main.cpp:(.text+0x17): undefined reference to opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterOptions::OtlpGrpcMetricExporterOptions()'
/usr/bin/ld: main.cpp:(.text+0x4b): undefined reference to opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterFactory::Create(opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterOptions const&)' /usr/bin/ld: main.cpp:(.text+0x28d): undefined reference to opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterOptions::~OtlpGrpcMetricExporterOptions()'

source code:

#include
#include
#include
#include

#include "opentelemetry/sdk/metrics/meter_provider_factory.h"
#include "opentelemetry/sdk/metrics/meter_context_factory.h"
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_options.h"
#include "opentelemetry/metrics/provider.h"

namespace metric_sdk = opentelemetry::sdk::metrics;
namespace metrics_api = opentelemetry::metrics;
namespace otlp = opentelemetry::exporter::otlp;

void InitMetrics()
{
// Configure OTLP gRPC exporter
otlp::OtlpGrpcMetricExporterOptions opts;
opts.endpoint = "localhost:4317"; // Change if your collector is remote
opts.use_ssl_credentials = false; // Set to true and configure certs if using TLS

auto exporter = otlp::OtlpGrpcMetricExporterFactory::Create(opts);

// Configure periodic metric reader
metric_sdk::PeriodicExportingMetricReaderOptions reader_options;
reader_options.export_interval_millis = std::chrono::milliseconds(1000);
reader_options.export_timeout_millis = std::chrono::milliseconds(500);

auto reader = metric_sdk::PeriodicExportingMetricReaderFactory::Create(std::move(exporter), reader_options);

// Create MeterContext and MeterProvider
auto context = metric_sdk::MeterContextFactory::Create();
context->AddMetricReader(std::move(reader));

auto provider = metric_sdk::MeterProviderFactory::Create(std::move(context));

//metrics_api::Provider::SetMeterProvider(provider);
auto std_shared_provider = std::shared_ptr<metrics_api::MeterProvider>(std::move(provider));
metrics_api::Provider::SetMeterProvider(opentelemetry::nostd::shared_ptr<metrics_api::MeterProvider>(std_shared_provider));
}

int main()
{
InitMetrics();

// Get a meter and create a counter
auto meter = metrics_api::Provider::GetMeterProvider()->GetMeter("my_app", "1.0.0");
auto counter = meter->CreateUInt64Counter("my_counter");

// Simulate metric recording
for (int i = 0; i < 10; ++i)
{
    counter->Add(1, {{"env", "dev"}});
    std::cout << "Metric recorded: my_counter += 1" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

return 0;

}

compiling commands
mkdir build_manual
cd build_manual
cmake ..
make

CMakeList.txt

cmake_minimum_required(VERSION 3.10)
project(MyTelemetryProject)

add_executable(${PROJECT_NAME}
main.cpp
)

set(CMAKE_TOOLCHAIN_FILE "/opt/Anurag/vcpkg/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/opt/vijay/build/vcpkg_installed/x64-linux/share/opentelemetry-cpp;/opt/vijay/build/vcpkg_installed/x64-linux/share/absl;/opt/vijay/build/vcpkg_installed/x64-linux/share/grpc;/opt/vijay/build/vcpkg_installed/x64-linux/share/upb;/opt/vijay/build/vcpkg_installed/x64-linux/share/protobuf;/opt/vijay/build/vcpkg_installed/x64-linux/share/curl;/opt/vijay/build/vcpkg_installed/x64-linux/share/c-ares;/opt/vijay/build/vcpkg_installed/x64-linux/share/re2")

Set Protobuf include and library paths BEFORE find_package

set(Protobuf_INCLUDE_DIR "/opt/vijay/vcpkg_installed/x64-linux/include")
set(Protobuf_LIBRARY "/usr/local/qualys/cloud-agent/lib/libprotobuf.so")

find_package(protobuf REQUIRED)
#find_package(curl REQUIRED)

include_directories(${Protobuf_INCLUDE_DIR})
link_directories(/usr/local/qualys/cloud-agent/lib)

find_package(opentelemetry-cpp CONFIG REQUIRED)

target_link_libraries(${PROJECT_NAME}
PRIVATE
opentelemetry-cpp::sdk
opentelemetry-cpp::otlp_grpc_exporter
opentelemetry-cpp::metrics
${Protobuf_LIBRARY}
#pthread

)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with CMakeLists.txt and main.cpp, then reproduce the failure with the shown cmake and make commands. Check how the opentelemetry-cpp OTLP gRPC exporter target and its dependencies are linked; done means the example compiles and links without the reported undefined references.

Written by the indexing model from the issue text.

Assessment

Tech stack
cmake, cpp, grpc
Domain
backend, build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.