es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bazel no pudo enlazar una biblioteca personalizada.

Cuando el constructor está definido en C++, cc_test no pudo enlazar la biblioteca.

en el archivo task.h

class Task
{
public:
  Task(const std::string &name,
       std::function<void()> &&f,
       const absl::Time &run_time,
       bool repeat = false,
       const absl::Duration &interval = absl::Seconds(0))
      : name_(name), f_(f), repeat_(repeat), interval_(interval), run_time_(run_time)
  {
  }

  Task(const std::string &name,
       std::function<void()> &&f,
       const std::string &run_time,
       const std::string &time_zone,
       bool repeat = false,
       const absl::Duration &interval = absl::Seconds(0))
      : name_(name), f_(f), repeat_(repeat), interval_(interval)
  {
    run_time_ = util::ParseFromString(run_time, time_zone);
  }

  virtual ~Task() {}

  void Run();

  void IncrementRunTime();

  bool GetRepeat();

  absl::Time GetRunTime();

  std::string GetName();

private:
  std::string name_;

  std::function<void()> f_;

  bool repeat_;

  absl::Duration interval_;

  absl::Time run_time_;
};

en el archivo client.cpp

std::shared_ptr<task> begin_task =
    std::make_shared<task>(
        StrJoin({std::string("begin_task_for_client"), config.name()}, "-"),
        [this] {
          // a bunch of work.
        },
        begin_time,
        true,
        Hours(24));

Scheduler::Get().InsertTask(begin_task);

Si defino el constructor en el archivo .h, cc_test se construye correctamente.

Pero si defino el constructor en el archivo .cpp, cc_test da el siguiente error:

gcc failed: error executing command /usr/bin/gcc @bazel-out/k8-opt/bin/system/module/data/client/client_test-2.params

Utilice –sandbox_debug para ver mensajes detallados desde el sandbox

bazel-out/k8-opt/bin/_solib_k8/libsystem_Smodule_Sdata_Sclient_Slibclient.so: error: undefined reference to ‘module::Task::Task(std::basic_string<char,></char,>, std::allocator > const&, std::function&, absl::Time const&, bool, absl::Duration const&)’ collect2: error: ld returned 1 exit status</void()></void()></void()>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el enlazador no puede encontrar la definición del constructor para la clase Task que se está utilizando en client.cpp. Este error ocurre cuando el constructor se define en el archivo .cpp en lugar del archivo .h.

    Para resolver este error, el constructor debería ser definido en el archivo de cabecera, de modo que pueda ser accedido por el enlazador durante la construcción de prueba. Alternativamente, puedes proporcionar una instancia de plantilla explícita para el constructor en el archivo .cpp para que el enlazador lo encuentre.

Comments are closed.