opentelemetry-cpp icon indicating copy to clipboard operation
opentelemetry-cpp copied to clipboard

ext/src/dll/input.src is missing many needed symbols

Open vkrevs opened this issue 3 months ago • 3 comments

Describe your environment Windows 11, VS2022, cmake-4.1.1, ninja 1.13.1 opentelemetry-cpp dependencies are built as shared libraries

We've been using opentelemetry-cpp on Linux for several years now and have decided to support opentelemetry instrumentation on Windows. Having built opentelemetry-cpp built as a single DLL on Windows, we try to link our application code with opentelemetry_cpp's import library and that results in many LNK2019 errors.

Steps to reproduce

Build opentelemetry 1.23.0 on Windows as a single shared dll (using OPENTELEMETRY_BUILD_DLL cmake option) with the following command:

cmake <BUILD_ROOT>\opentelemetry-cpp-1.23.0 -DCMAKE_CXX_FLAGS="/std:c++17 /EHsc" -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=OFF -DCMAKE_BUILD_TYPE=Release -GNinja -DWITH_ABI_VERSION=2 -DWITH_ABI_VERSION_2=ON -DWITH_ABI_VERSION_1=OFF -DBUILD_TESTING=OFF -DWITH_ABSEIL=ON -DWITH_DEPRECATED_SDK_FACTORY=OFF -DWITH_OTLP_GRPC=OFF -DWITH_OTLP_FILE=ON -DWITH_OTLP_HTTP=ON -DWITH_OTLP_HTTP_COMPRESSION=ON -DWITH_EXAMPLES=OFF -DWITH_EXAMPLES_HTTP=OFF -DWITH_OTLP_HTTP_SSL_PREVIEW=ON -DWITH_OTLP_HTTP_SSL_TLS_PREVIEW=ON -DOPENSSL_USE_STATIC_LIBS=TRUE -DOPENSSL_ROOT_DIR=<BUILD_ROOT>\openssl_home -DCURL_USE_STATIC_LIBS=TRUE -DOPENTELEMETRY_BUILD_DLL=ON -DOPENTELEMETRY_INSTALL=ON -DOTELCPP_PROTO_PATH=<BUILD_ROOT>/opentelemetry-proto-1.7.0 -DCMAKE_INSTALL_PREFIX=<BUILD_ROOT>\Release\opentelemetry-cpp-1.23.0-bin -DCMAKE_PREFIX_PATH="<BUILD_ROOT>\Release\json-3.12.0-bin;<BUILD_ROOT>\Release\zlib-1.3.1-bin;<BUILD_ROOT>\libcurl_home;<BUILD_ROOT>\openssl_home;<BUILD_ROOT>\Release\googletest-1.17.0-bin;<BUILD_ROOT>\Release\benchmark-1.9.4-bin;<BUILD_ROOT>\Release\protobuf-32.0-bin;<BUILD_ROOT>\Release\abseil-cpp-20250512.1-bin"

Then attempt to link the resulting import library on Windows into another shared library uses traces, exporters, resources, samplers, etc

What is the expected behavior? What did you expect to see? Successful link without unresolved symbols, just like on Linux.

What is the actual behavior? What did you see instead? Many LNK2019 errors.

	msbuild /clp:ErrorsOnly;ShowCommandLine /nologo /p:Configuration=<configuration> /p:Platform=<x86 or x64> <solution file>
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class opentelemetry::v2::nostd::shared_ptr<class opentelemetry::v2::sdk::common::internal_log::LogHandler> __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::GetLogHandler(void)" (?GetLogHandler@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SA?AV?$shared_ptr@VLogHandler@internal_log@common@sdk@v2@opentelemetry@@@nostd@56@XZ) referenced in function <function1> [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: static class opentelemetry::v2::nostd::shared_ptr<class opentelemetry::v2::sdk::common::internal_log::LogHandler> __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::GetLogHandler(void)" (?GetLogHandler@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SA?AV?$shared_ptr@VLogHandler@internal_log@common@sdk@v2@opentelemetry@@@nostd@56@XZ) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: static class opentelemetry::v2::nostd::shared_ptr<class opentelemetry::v2::sdk::common::internal_log::LogHandler> __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::GetLogHandler(void)" (?GetLogHandler@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SA?AV?$shared_ptr@VLogHandler@internal_log@common@sdk@v2@opentelemetry@@@nostd@56@XZ) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static void __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::SetLogHandler(class opentelemetry::v2::nostd::shared_ptr<class opentelemetry::v2::sdk::common::internal_log::LogHandler> const &)" (?SetLogHandler@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SAXABV?$shared_ptr@VLogHandler@internal_log@common@sdk@v2@opentelemetry@@@nostd@56@@Z) referenced in function __catch$<function2>$0 [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: static void __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::SetLogHandler(class opentelemetry::v2::nostd::shared_ptr<class opentelemetry::v2::sdk::common::internal_log::LogHandler> const &)" (?SetLogHandler@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SAXABV?$shared_ptr@VLogHandler@internal_log@common@sdk@v2@opentelemetry@@@nostd@56@@Z) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static enum opentelemetry::v2::sdk::common::internal_log::LogLevel __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::GetLogLevel(void)" (?GetLogLevel@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SA?AW4LogLevel@23456@XZ) referenced in function <function1> [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: static enum opentelemetry::v2::sdk::common::internal_log::LogLevel __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::GetLogLevel(void)" (?GetLogLevel@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SA?AW4LogLevel@23456@XZ) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: static enum opentelemetry::v2::sdk::common::internal_log::LogLevel __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::GetLogLevel(void)" (?GetLogLevel@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SA?AW4LogLevel@23456@XZ) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static void __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::SetLogLevel(enum opentelemetry::v2::sdk::common::internal_log::LogLevel)" (?SetLogLevel@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SAXW4LogLevel@23456@@Z) referenced in function __catch$<function2>$0 [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: static void __cdecl opentelemetry::v2::sdk::common::internal_log::GlobalLogHandler::SetLogLevel(enum opentelemetry::v2::sdk::common::internal_log::LogLevel)" (?SetLogLevel@GlobalLogHandler@internal_log@common@sdk@v2@opentelemetry@@SAXW4LogLevel@23456@@Z) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class opentelemetry::v2::sdk::resource::Resource __cdecl opentelemetry::v2::sdk::resource::Resource::Create(class opentelemetry::v2::sdk::common::AttributeMap const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?Create@Resource@resource@sdk@v2@opentelemetry@@SA?AV12345@ABVAttributeMap@common@345@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "<function5>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class opentelemetry::v2::sdk::resource::Resource & __cdecl opentelemetry::v2::sdk::resource::Resource::GetDefault(void)" (?GetDefault@Resource@resource@sdk@v2@opentelemetry@@SAAAV12345@XZ) referenced in function "<function6>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::SpanProcessor,struct std::default_delete<class opentelemetry::v2::sdk::trace::SpanProcessor> > __cdecl opentelemetry::v2::sdk::trace::BatchSpanProcessorFactory::Create(class std::unique_ptr<class opentelemetry::v2::sdk::trace::SpanExporter,struct std::default_delete<class opentelemetry::v2::sdk::trace::SpanExporter> > &&,struct opentelemetry::v2::sdk::trace::BatchSpanProcessorOptions const &)" (__imp_?Create@BatchSpanProcessorFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VSpanProcessor@trace@sdk@v2@opentelemetry@@U?$default_delete@VSpanProcessor@trace@sdk@v2@opentelemetry@@@std@@@std@@$$QAV?$unique_ptr@VSpanExporter@trace@sdk@v2@opentelemetry@@U?$default_delete@VSpanExporter@trace@sdk@v2@opentelemetry@@@std@@@7@ABUBatchSpanProcessorOptions@2345@@Z) referenced in function "<function9>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::Sampler,struct std::default_delete<class opentelemetry::v2::sdk::trace::Sampler> > __cdecl opentelemetry::v2::sdk::trace::AlwaysOffSamplerFactory::Create(void)" (?Create@AlwaysOffSamplerFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VSampler@trace@sdk@v2@opentelemetry@@U?$default_delete@VSampler@trace@sdk@v2@opentelemetry@@@std@@@std@@XZ) referenced in function "<function7>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::Sampler,struct std::default_delete<class opentelemetry::v2::sdk::trace::Sampler> > __cdecl opentelemetry::v2::sdk::trace::AlwaysOnSamplerFactory::Create(void)" (?Create@AlwaysOnSamplerFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VSampler@trace@sdk@v2@opentelemetry@@U?$default_delete@VSampler@trace@sdk@v2@opentelemetry@@@std@@@std@@XZ) referenced in function "<function7>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::Sampler,struct std::default_delete<class opentelemetry::v2::sdk::trace::Sampler> > __cdecl opentelemetry::v2::sdk::trace::ParentBasedSamplerFactory::Create(class std::shared_ptr<class opentelemetry::v2::sdk::trace::Sampler> const &)" (?Create@ParentBasedSamplerFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VSampler@trace@sdk@v2@opentelemetry@@U?$default_delete@VSampler@trace@sdk@v2@opentelemetry@@@std@@@std@@ABV?$shared_ptr@VSampler@trace@sdk@v2@opentelemetry@@@7@@Z) referenced in function "<function7>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::Sampler,struct std::default_delete<class opentelemetry::v2::sdk::trace::Sampler> > __cdecl opentelemetry::v2::sdk::trace::TraceIdRatioBasedSamplerFactory::Create(double)" (?Create@TraceIdRatioBasedSamplerFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VSampler@trace@sdk@v2@opentelemetry@@U?$default_delete@VSampler@trace@sdk@v2@opentelemetry@@@std@@@std@@N@Z) referenced in function "<function7>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::TracerContext,struct std::default_delete<class opentelemetry::v2::sdk::trace::TracerContext> > __cdecl opentelemetry::v2::sdk::trace::TracerContextFactory::Create(class std::vector<class std::unique_ptr<class opentelemetry::v2::sdk::trace::SpanProcessor,struct std::default_delete<class opentelemetry::v2::sdk::trace::SpanProcessor> >,class std::allocator<class std::unique_ptr<class opentelemetry::v2::sdk::trace::SpanProcessor,struct std::default_delete<class opentelemetry::v2::sdk::trace::SpanProcessor> > > > &&,class opentelemetry::v2::sdk::resource::Resource const &)" (__imp_?Create@TracerContextFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VTracerContext@trace@sdk@v2@opentelemetry@@U?$default_delete@VTracerContext@trace@sdk@v2@opentelemetry@@@std@@@std@@$$QAV?$vector@V?$unique_ptr@VSpanProcessor@trace@sdk@v2@opentelemetry@@U?$default_delete@VSpanProcessor@trace@sdk@v2@opentelemetry@@@std@@@std@@V?$allocator@V?$unique_ptr@VSpanProcessor@trace@sdk@v2@opentelemetry@@U?$default_delete@VSpanProcessor@trace@sdk@v2@opentelemetry@@@std@@@std@@@2@@7@ABVResource@resource@345@@Z) referenced in function "<function10>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class std::unique_ptr<class opentelemetry::v2::sdk::trace::TracerContext,struct std::default_delete<class opentelemetry::v2::sdk::trace::TracerContext> > __cdecl opentelemetry::v2::sdk::trace::TracerContextFactory::Create(class std::vector<class std::unique_ptr<class opentelemetry::v2::sdk::trace::SpanProcessor,struct std::default_delete<class opentelemetry::v2::sdk::trace::SpanProcessor> >,class std::allocator<class std::unique_ptr<class opentelemetry::v2::sdk::trace::SpanProcessor,struct std::default_delete<class opentelemetry::v2::sdk::trace::SpanProcessor> > > > &&,class opentelemetry::v2::sdk::resource::Resource const &,class std::unique_ptr<class opentelemetry::v2::sdk::trace::Sampler,struct std::default_delete<class opentelemetry::v2::sdk::trace::Sampler> >)" (__imp_?Create@TracerContextFactory@trace@sdk@v2@opentelemetry@@SA?AV?$unique_ptr@VTracerContext@trace@sdk@v2@opentelemetry@@U?$default_delete@VTracerContext@trace@sdk@v2@opentelemetry@@@std@@@std@@$$QAV?$vector@V?$unique_ptr@VSpanProcessor@trace@sdk@v2@opentelemetry@@U?$default_delete@VSpanProcessor@trace@sdk@v2@opentelemetry@@@std@@@std@@V?$allocator@V?$unique_ptr@VSpanProcessor@trace@sdk@v2@opentelemetry@@U?$default_delete@VSpanProcessor@trace@sdk@v2@opentelemetry@@@std@@@std@@@2@@7@ABVResource@resource@345@V?$unique_ptr@VSampler@trace@sdk@v2@opentelemetry@@U?$default_delete@VSampler@trace@sdk@v2@opentelemetry@@@std@@@7@@Z) referenced in function "<function10>) [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall opentelemetry::v2::sdk::common::internal_log::LogHandler::~LogHandler(void)" (??1LogHandler@internal_log@common@sdk@v2@opentelemetry@@UAE@XZ) referenced in function __unwindfunclet$??<function8> [<path to project file>\project1.vcxproj]
    78>file1.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall opentelemetry::v2::sdk::common::internal_log::NoopLogHandler::Handle(enum opentelemetry::v2::sdk::common::internal_log::LogLevel,char const *,int,char const *,class opentelemetry::v2::sdk::common::AttributeMap const &)" (?Handle@NoopLogHandler@internal_log@common@sdk@v2@opentelemetry@@UAEXW4LogLevel@23456@PBDH1ABVAttributeMap@3456@@Z) [<path to project file>\project1.vcxproj]
    78><path to filnal dll>\project1.dll : fatal error LNK1120: 15 unresolved externals [<path to project file>\project1.vcxproj]

Additional context ext/src/dll/input.src simply does not contain everything that is needed ... At least the following need to be added to resolve the above link errors: Create@AlwaysOffSamplerFactory@trace@sdk@v1@opentelemetry Create@AlwaysOnSamplerFactory@trace@sdk@v1@opentelemetry Create@BatchSpanProcessorFactory@trace@sdk@v1@opentelemetry Create@ParentBasedSamplerFactory@trace@sdk@v1@opentelemetry Create@Resource@resource@sdk@v1@opentelemetry Create@TraceIdRatioBasedSamplerFactory@trace@sdk@v1@opentelemetry Create@TracerContextFactory@trace@sdk@v1@opentelemetry GetDefault@Resource@resource@sdk@v1@opentelemetry GetLogHandler@GlobalLogHandler@internal_log@common@sdk@v1@opentelemetry LogHandler@internal_log@common@sdk@v1@opentelemetry GetLogLevel@GlobalLogHandler@internal_log@common@sdk@v1@opentelemetry Handle@NoopLogHandler@internal_log@common@sdk@v1@opentelemetry SetLogHandler@GlobalLogHandler@internal_log@common@sdk@v1@opentelemetry SetLogLevel@GlobalLogHandler@internal_log@common@sdk@v1@opentelemetry SetLogLevel@GlobalLogHandler@internal_log@common@sdk@v1@opentelemetry

Or even better, add missing OPENTELEMETRY_EXPORT macros to all public classes instead of using the DEF file generated from input.src.

There are also numerous C4251/C4275 warnings such as below. Which are quite hassle when you compile all code with warnings as errors.

warning C4251: 'opentelemetry::v2::trace::TraceState::kv_properties_' : 'opentelemetry::v2::nostd::unique_ptropentelemetry::v2::common::KeyValueProperties' needs to have dll -interface to be used by clients of 'opentelemetry::v2::trace::TraceState' warning C4275: non dll-interface class 'opentelemetry::v2::trace::Span' used as base for dll-interface class 'opentelemetry::v2::trace::NoopSpan' Tip: React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it. Learn more here.

vkrevs avatar Sep 29 '25 16:09 vkrevs

More missing symbols: AddView@MeterContext@metrics@sdk@v1@opentelemetry GetResource@MeterContext@metrics@sdk@v1@opentelemetry ForceFlush@MeterContext@metrics@sdk@v1@opentelemetry Shutdown@MeterContext@metrics@sdk@v1@opentelemetry AddView@MeterProvider@metrics@sdk@v1@opentelemetry GetMeter@MeterProvider@metrics@sdk@v1@opentelemetry RemoveMeter@MeterProvider@metrics@sdk@v1@opentelemetry GetResource@MeterProvider@metrics@sdk@v1@opentelemetry ForceFlush@MeterProvider@metrics@sdk@v1@opentelemetry Shutdown@MeterProvider@metrics@sdk@v1@opentelemetry

vkrevs avatar Oct 31 '25 17:10 vkrevs

If you are compiling with WITH_ABI_VERSION=2 - then instead of @v1@ (e.g. ::v1::) it should be @v2@

malkia avatar Nov 14 '25 22:11 malkia

If you are compiling with WITH_ABI_VERSION=2 - then instead of @v1@ (e.g. ::v1::) it should be @v2@

Yes, i know, and reported this already. https://github.com/open-telemetry/opentelemetry-cpp/issues/3646

vkrevs avatar Nov 15 '25 09:11 vkrevs