Ho creato un sistema che registra automaticamente gli oggetti funzione (funtori) in una mappa basata sul costruttore di un'istanza globale.Variabile globale C++ non inizializzata quando collegata tramite librerie statiche, ma OK quando compilata con l'origine
In ogni file cpp che definisce il functor, esiste un'istanza globale dell'istanza della classe registrar per registrare il functor su un oggetto singleton std::map<int, std::function<...> >
.
Questa è la definizione di classe di registrar:
template
<
typename map_type,
typename handler_type
>
struct registrar
{
registrar
(
map_type& map_object,
boost::uint16_t cmd_code,
const handler_type& handler
)
{
map_object.insert(std::pair<boost::uint16_t, handler_type>(cmd_code, handler));
}
};
in ogni file cpp. L'istanza globale è definita in questo modo:
namespace one_way
{
static registrar <in_out_map_type, handler>
post_receiver(in_out_map_type::instance(), command, handlers());
}
Tutto funziona correttamente se si compila tutto il cpp con il main.cpp insieme. Ma se compilo il file cpp in una libreria statica e lo collego a main.cpp
, la registrazione non funziona.
Ho eseguito il test con VC10 e GCC4.61 su Windows & e Ubuntu 11.10. Entrambi falliscono.
Ho trovato a thread with the same problem ma OP non ha detto se l'ha risolto o no.
Mi manca qualcosa?
Modifica
Grazie per tutte le risposte tra i commenti.
Ogni risposta mi ha davvero aiutato a pensare di più e ad approfondire questo metodo. Dopo tutto lo studio e prove, alla fine ho rinunciato all'idea di fare affidamento su variabile globale/static per l'auto-registrazione attraverso i confini binari, perché non c'è portatile modo per garantire che funzionerà.
Il mio ultimo modo è di mantenere la registrazione all'interno di un file binario.
Non viene mostrato come si sta chiamando il registrar per le funzioni registrate. Inoltre, c'è un errore di battitura nell''istanza globale '('handlers()' invece di 'handler()')? A meno che manchi qualcosa, ciò definisce una funzione, non una variabile globale. Quindi, ci sono, mi sembra, un numero di punti di connessione mancanti nell'immagine ... –
Affidarsi all'inizializzazione statica per registrare le funzioni è probabilmente un errore un po 'incline a lungo termine. Hai preso in considerazione solo la registrazione esplicita? –
Per GCC, date un'occhiata a -Wl, - aiuta l'intero archivio. –