• Martes 12 de Noviembre de 2024, 21:02

Autor Tema:  Error Al Linkar Utilizando G++  (Leído 1288 veces)

galco

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Error Al Linkar Utilizando G++
« en: Jueves 30 de Diciembre de 2004, 01:14 »
0
Al compilar el codigo de aquí abajo con 'g++ senyaloriginal.cpp' me da error al linkar. Alguien me puede decir porque? Es un codigo copiado que a priori tendría que fucionar. Lo que pasa es que he cojido los trozitos de un documento y quizas el orden de las clases no este bien. Todo este codigo lo tengo metido en un único fichero.


#include <signal.h>
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <stdlib.h>

class Event_Handler
{
public:
  // Hook method for the signal hook method.
  virtual int handle_signal (int signum) = 0;

  // ... other hook methods for other types of
  // events such as timers, I/O, and
  // synchronization objects.
};


class Signal_Handler
{
public:
 // Entry point.
 static Signal_Handler *instance (void);

 // Register an event handler <eh> for <signum>
 // and return a pointer to any existing <Event_Handler>
 // that was previously registered to handle <signum>.
 Event_Handler *register_handler (int signum,Event_Handler *eh);

 // Remove the <Event_Handler> for <signum>
 // by setting the slot in the <signal_handlers_>
 // table to NULL.
 int remove_handler (int signum);

private:
 // Ensure we're a Singleton.
 Signal_Handler (void);

 // Singleton pointer.
 static Signal_Handler *instance_;

 // Entry point adapter installed into <sigaction>
 // (must be a static method or a stand-alone
 // extern "C" function).
 static void dispatcher (int signum);

 // Table of pointers to concrete <Event_Handler>s
 // registered by applications.  NSIG is the number of
 // signals defined in </usr/include/sys/signal.h>.
 static Event_Handler *signal_handlers_[NSIG];
};


Event_Handler * Signal_Handler::register_handler (int signum, Event_Handler *eh){
  // Copy the <old_eh> from the <signum> slot in
  // the <signal_handlers_> table.
  Event_Handler *old_eh = Signal_Handler::signal_handlers_[signum];

  // Store <eh> into the <signum> slot in the
  // <signal_handlers_> table.
  Signal_Handler::signal_handlers_[signum] = eh;
 
  // Register the <dispatcher> to handle this
  // <signum>.
  struct sigaction sa;
  sa.sa_handler = Signal_Handler::dispatcher;
  sigemptyset (&sa.sa_mask);
  sa.sa_flags = 0;
  sigaction (signum, &sa, 0);

  return old_eh;
}

void Signal_Handler::dispatcher (int signum){
  // Perform a sanity check...
  if (Signal_Handler::signal_handlers_[signum] != 0)
    // Dispatch the handler's hook method.
    Signal_Handler::signal_handlers_
      [signum]->handle_signal (signum);
}

class SIGINT_Handler : public Event_Handler{
public:
  SIGINT_Handler (void)
    : graceful_quit_ (0) {}

  // Hook method.
  virtual int handle_signal (int signum){
    assert (signum == SIGINT);
    this->graceful_quit_ = 1;
  }

  // Accessor.
  sig_atomic_t graceful_quit (void)
  { return this->graceful_quit_; }

private:
  sig_atomic_t graceful_quit_;
};

class SIGQUIT_Handler : public Event_Handler{
public:
  SIGQUIT_Handler (void)
    : abortive_quit_ (0) {}

  // Hook method.
  virtual int handle_signal (int signum){
    assert (signum == SIGQUIT);
    this->abortive_quit_ = 1;
  }

  // Accessor.
  sig_atomic_t abortive_quit (void)
  { return this->abortive_quit_; }

private:
  sig_atomic_t abortive_quit_;
};

int main (void){
  SIGINT_Handler sigint_handler;
  SIGQUIT_Handler sigquit_handler;

  // Register the handler for SIGINT.  
  Signal_Handler::instance ()->register_handler (SIGINT, &sigint_handler);

  // Register the handler for SIGQUIT.
  Signal_Handler::instance ()->register_handler (SIGQUIT, &sigquit_handler);

  // Run the main event loop.
  while (sigint_handler.graceful_quit () == 0 && sigquit_handler.abortive_quit () == 0)
    printf("treballa");

  if (sigquit_handler.abortive_quit () == 1)
    _exit (1);
  else /* if sigint_handler.graceful_quit () */ {
    printf("neteja");
    return 1;
  }
}
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

mgitano2001

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Error Al Linkar Utilizando G++
« Respuesta #1 en: Jueves 30 de Diciembre de 2004, 04:48 »
0
Hola, estaria bueno que pongas el tipo de error que te tira en el linkeo, asi lo analizo mejor.
Saludos Mgitano2001
</span></span>

galco

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Error Al Linkar Utilizando G++
« Respuesta #2 en: Jueves 30 de Diciembre de 2004, 10:13 »
0
Éste es el error que me da al linkar. Gracias

galco@linux:~/xarxes> g++ senyaloriginal.cpp
/tmp/cceB25oJ.o(.text+0xf): En la función `Signal_Handler::register_handler(int, Event_Handler*)':
: undefined reference to `Signal_Handler::signal_handlers_'
/tmp/cceB25oJ.o(.text+0x1f): En la función `Signal_Handler::register_handler(int, Event_Handler*)':
: undefined reference to `Signal_Handler::signal_handlers_'
/tmp/cceB25oJ.o(.text+0x72): En la función `Signal_Handler::dispatcher(int)':
: undefined reference to `Signal_Handler::signal_handlers_'
/tmp/cceB25oJ.o(.text+0x82): En la función `Signal_Handler::dispatcher(int)':
: undefined reference to `Signal_Handler::signal_handlers_'
/tmp/cceB25oJ.o(.text+0x91): En la función `Signal_Handler::dispatcher(int)':
: undefined reference to `Signal_Handler::signal_handlers_'
/tmp/cceB25oJ.o(.text+0xd9): En la función `main':
: undefined reference to `Signal_Handler::instance()'
/tmp/cceB25oJ.o(.text+0xf6): En la función `main':
: undefined reference to `Signal_Handler::instance()'
collect2: ld returned 1 exit status

galco

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Error Al Linkar Utilizando G++
« Respuesta #3 en: Sábado 1 de Enero de 2005, 20:14 »
0
Solucionado!
Me faltaba definir la variable static fuera de la clase y implementar una función de la cuals sólo había la definición.

Gracias