Jaegerw с yaml- cpp Ошибка соединения - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть программа на С ++, которая использует Jaeger для трассировки

#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

Я не знаю, почему моя компиляция не удалась .

У меня есть libyaml-cppd.so.0.6 в каталоге yaml-cpp/build, и я попытался скомпилировать этот путь, но он все еще не работает.

ОС - Ubuntu 18.04

1 Ответ

1 голос
/ 29 февраля 2020

-I используется для include путей. Используйте -L для путей к библиотекам:

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

Похоже, вы также связались с общей библиотекой libyaml-cppd.so, а не с stati c library libyaml-cpp.a. Я не узнаю d в libyaml-cppd.so. Я бы проверил, действительно ли это библиотека, которую вы создали.

libyaml-cpp будет по умолчанию построен как библиотека stati c (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 ( используйте экономную версию 0.11 или 0.11 +)

...