Skip to content

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

Open
@vijaymbhaskar

Description

@vijaymbhaskar

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

)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingtriage/needs-informationIndicates an issue needs more information in order to work on it.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions