Skip to content

ext/src/dll/input.src is missing many needed symbolsย #3673

@vkrevs

Description

@vkrevs

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingtriage/acceptedIndicates an issue or PR is ready to be actively worked on.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions