-
Notifications
You must be signed in to change notification settings - Fork 500
Description
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.