Sto assumendo che state vedendo questo behavious perché si sta facendo in linea di inizializzazione delle variabili globali senza una chiamata di funzione esplicita. per esempio. globals.cpp:
// top of source file
#include "myincludes.h"
CSomeClass someObject(432);
int global_x = 42;
int global_y = InitY();
Il costruttore e distruttore ordine degli oggetti globali e ordine globale inizializzazione delle variabili è per lo più non-deterministico. (Direi, senza consultare le pagine di riferimento standard, che le variabili in un file sorgente vengano inizializzate dalla prima dichiarazione in basso, ma l'ordine di "quale file sorgente viene prima" non è definito.)
La soluzione migliore è non avere oggetti globali (dove il costruttore viene eseguito prima di qualsiasi funzione nella libreria) o avere una dipendenza dall'ordine di inizializzazione delle variabili globali.
Meglio disporre di una funzione che inizializza in modo esplicito la libreria. Forse hai bisogno che l'app chiami questa funzione all'avvio o le funzioni esportate della tua libreria lo chiamino dopo aver rilevato che l'inizializzazione non è avvenuta. Inizializza quindi i tuoi globali.
Nella mia squadra, il codice che viene eseguito prima di "main" (o "DllMain") è severamente vietato. In altre parole, nessun oggetto globale. Nessuna funzione per avviare globals.
Si sta verificando il [fiasco dell'ordine di inizializzazione statico] [1]. [1]: http://stackoverflow.com/questions/3035422/static-initialization-order-fiasco – kfmfe04
Grazie, questo chiarisce almeno il problema. – sholsapp