opentracing-cpp
opentracing-cpp copied to clipboard
OpenTracing in Vcpkg
More than an issue an announcement :)
I have added OpenTracing to vcpkg (C++ Library Manager) repository via this merged PR: https://github.com/Microsoft/vcpkg/pull/5974
It works in Windows and Linux (probably in macOS but vcpkg doesn't run in macOS yet).
During the porting I have found two problems:
- no UWP support (not important)
- cannot build the static version without the dynamic one (so vcpkg builds either the dynamic version or the static AND dynamic version)
Install the package with:
vcpkg install opentracing
Then use it in cmake (dynamic version):
find_package(OpenTracing CONFIG REQUIRED)
target_link_libraries(main PRIVATE OpenTracing::opentracing)
or (static version):
find_package(OpenTracing CONFIG REQUIRED)
target_link_libraries(main PRIVATE OpenTracing::opentracing-static)
Did you try building with cmake -DBUILD_SHARED_LIBS=OFF
? -- that should produce only the static library.
Yes, I tried that.
Using this command:
vcpkg install opentracing --triplet x64-windows-static
That does this definitions in a modified portfile
-DBUILD_SHARED_LIBS=OFF
-DBUILD_STATIC_LIBS=ON
-DBUILD_MOCKTRACER=OFF
-DBUILD_DYNAMIC_LOADING=OFF
I got this errors (same with BUILD_DYNAMIC_LOADING=ON):
tracer_test.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class std::error_category const & __cdecl opentracing::v2::propagation_error_category(void)" (__imp_?propagation_error_category@v2@opentracing@@YAAEBVerror_category@std@@XZ) referenced in function "void __cdecl opentracing::v2::`dynamic initializer for 'invalid_carrier_error''(void)" (??__Einvalid_carrier_error@v2@opentracing@@YAXXZ)
tracer_test.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::unique_ptr<class opentracing::v2::Span,struct std::default_delete<class opentracing::v2::Span> > __cdecl opentracing::v2::Tracer::StartSpan(class opentracing::v2::string_view,class std::initializer_list<class opentracing::v2::option_wrapper<class opentracing::v2::StartSpanOption> >)const " (__imp_?StartSpan@Tracer@v2@opentracing@@QEBA?AV?$unique_ptr@VSpan@v2@opentracing@@U?$default_delete@VSpan@v2@opentracing@@@std@@@std@@Vstring_view@23@V?$initializer_list@V?$option_wrapper@VStartSpanOption@v2@opentracing@@@v2@opentracing@@@5@@Z) referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____0(void)" (?____C_A_T_C_H____T_E_S_T____0@@YAXXZ)
tracer_test.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class std::shared_ptr<class opentracing::v2::Tracer> __cdecl opentracing::v2::MakeNoopTracer(void)" (__imp_?MakeNoopTracer@v2@opentracing@@YA?AV?$shared_ptr@VTracer@v2@opentracing@@@std@@XZ) referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____0(void)" (?____C_A_T_C_H____T_E_S_T____0@@YAXXZ)
tracer_test.cpp.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) class opentracing::v2::string_view const opentracing::v2::ext::span_kind" (__imp_?span_kind@ext@v2@opentracing@@3Vstring_view@23@B)
tracer_test.cpp.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) class opentracing::v2::string_view const opentracing::v2::ext::span_kind_rpc_client" (__imp_?span_kind_rpc_client@ext@v2@opentracing@@3Vstring_view@23@B)
Using -DBUILD_STATIC_LIBS=OFF
works fine for dynamic only builds.
Thanks,
My guess is it has something to do with this OPENTRACING_API macro applied before the variable declarations.
Could you investigate to see if it should be set to something else for static builds? I'm not very familiar with building for windows.
cc @mdouaihy
I will...
Found the problem. The CMakeLists.txt in mocktracer/test needs OPENTRACING_MOCK_TRACER_STATIC. I will open an PR.
I will wait for a OpenTracing release to modify the vcpkg portfile. If you don't mind I will keep this case open as a remainder :)
sorry for my late comment.
Note that linking statically OpenTracing can cause unexpected behavior: The Global Tracer will be defined in each library/binary linking statically with OpenTracing.
The current settings in vcpkg allows the compilation of shared and shared and static versions. The changes in the PR was to solve a problem in the CMakefiles.txt that prevents the static building alone. But, if static has no sense, then better just disable it, either in this project or in the vcpkg repo.
Just let me know...
Static causes problems only for the Global Tracer only on Windows. Maybe the user isn't using the Global Tracer.
@rnburn, do you think the static build should be prevented for that reason?