【问题标题】:Jaegerw with yaml-cpp Linking Errror带有 yaml-cpp 链接错误的 Jaeger
【发布时间】:2020-02-29 05:02:39
【问题描述】:

我有一个使用 Jaeger 进行跟踪的 c++ 程序

#include <iostream>
#include<memory>
#include <yaml-cpp/yaml.h>
// #include <opentracing/tracer.h>
#include<jaegertracing/Tracer.h>

namespace std
{

void init(const char *FilePath)
{
    auto yaml = YAML::LoadFile(FilePath);
    auto config = jaegertracing::Config::parse(yaml);
    auto tracer=jaegertracing::Tracer::make(
        "example-service",
        config,
        jaegertracing::logging::consoleLogger()
    );
    opentracing::Tracer::InitGlobal(
        static_pointer_cast<opentracing::Tracer>(tracer)
    );
}

void ChildSpan(const unique_ptr<opentracing::Span>& parentSpan){
    this_thread::sleep_for(1ms);
    auto childSpan = opentracing::Tracer::Global()->StartSpan("Span2",{opentracing::ChildOf(&parentSpan->context())});
}

void FollowsSpan(const unique_ptr<opentracing::Span>& followFromspan){
    this_thread::sleep_for(2ms);
    auto followSpan = opentracing::Tracer::Global()->StartSpan("Span3",{opentracing::FollowsFrom(&followFromspan->context())});
}

void ParentSpan(){
    auto span = opentracing::Tracer::Global()->StartSpan("Span1");
    ChildSpan(span);
    FollowsSpan(span);
    this_thread::sleep_for(3ms);
}

int main()
{
    init("./config.yaml");
    ParentSpan();
    return 0;
}
}

我使用它编译它 g++ -std=c++1z test.cpp -I /usr/local/lib/ -ljaegertracing -lyaml-cpp哪里 /usr/local/lib/libyaml-cpp.a是安装路径。

错误信息 -

/usr/bin/ld: warning: libyaml-cppd.so.0.6, needed by //usr/local/lib/libjaegertracing.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

我已经通过下载源代码安装了yaml-cpp-0.6.0 .tar 版本没有mkdir build,cd build,sudo make,sudo make install

我不知道为什么我的编译失败了。

我在yaml-cpp/build 目录中有libyaml-cppd.so.0.6 并尝试使用此路径进行编译,但仍然失败。

操作系统 - ubuntu 18.04

【问题讨论】:

  • 我还没有尝试过。我会尽快尝试更新你。 :)

标签: yaml-cpp jaeger


【解决方案1】:

-I 用于include 路径。库路径使用-L

g++ -std=c++1z test.cpp -L /usr/local/lib -ljaegertracing -lyaml-cpp

您似乎还链接到了共享库 libyaml-cppd.so,而不是静态库 libyaml-cpp.a。虽然我不认识libyaml-cppd.so 中的d。我会检查这是否真的是您构建的库。

libyaml-cpp 将默认构建为静态库 (libyaml-cpp.a),在 64 位机器上,它可能默认安装在 /usr/local/lib64 中。


您只能在namespace std 中做非常有限的事情。不允许添加新的函数/类(除非作为模板特化,包括用户定义的类型) - 所以在你的程序周围删除namespace std { ... }

还有。 main 函数应该在全局命名空间中。链接器找不到它的原因是您将它放在命名空间中(std)。

更新:问题已解决,请点击此链接 exaclty https://github.com/jaegertracing/jaeger-client-cpp/issues/162#issuecomment-565892473(使用 thrift 版本 0.11 或 0.11+)

【讨论】:

  • 不工作,要求特别高libyaml-cppd.so.0.6这个库但是找不到。
  • 现在当我从源代码重新安装时发生了一些奇怪的事情,它不是在构建 libyaml-cpp.so.0.6,而只是在构建 libyaml-cpp.a.。我不明白为什么会这样
  • @AbhinavSingh 您是否从 github 获得了最新的源代码?它默认生成静态库。 jaeger 库是否已预先构建以与 yaml-cpp btw 链接。如果是这样,yaml-cpp 的位置和版本号必须完全匹配。我不知道为什么它想要名称 libyaml-cppd.sod
  • 不,我正在使用 yaml-cpp 的 master 分支作为源代码,我想我到了那里,我会更新任何发生的事情。
  • tar 版本在编译时除了链接之外还产生了一些错误,所以切换到 github 的,它的 master 分支默认为 0.6.3。我找到了一个我认为与我的问题相似的链接github.com/jaegertracing/jaeger-client-cpp/issues/…我希望这对我有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多