2016-08-01 8 views
0

Ich bin ein Modul-Level-Funktionsaufruf mit einem Factory-Funktion mit einem Registry-Klasse registrieren:G ++ 4.9 - Funktion bei Modulbereich wird nicht aufgerufen?

static Controller * ctor(Device * device, const char *) { return new NullController(device); } 
static int s_id = DeviceRegistry::RegisterControllerClass("null", ctor); 

//------------------------------------------------------------------------------ 

NullController::NullController(Device * device) 
: Controller(device, "null", s_id) 
{ 
} 

wo zB :: DEV :: DeviceRegistry :: RegisterControllerClass() ist eine freie Funktion im Namensraum zB und DEV. Dies funktioniert gut unter Visual Studio, aber der Code scheint nicht aufgerufen zu werden, wenn er unter GCC/Linux ausgeführt wird. Wenn ich die RegisterControllerClass() breakpoint, wird er nicht aufgerufen. Nur für den Fall, dass der Compiler das Feld s_id optimiert hat, habe ich es verwendet, um die Basisklasse zu konstruieren. Ich bin mir sicher, dass es das nicht ist. Was ist mit diesem Code falsch?

+1

Sie müssen sicherstellen, dass die Übersetzungseinheit verknüpft ist. Eine Möglichkeit besteht darin, eine Funktion von 'main' aufzurufen. –

+2

Was ist der Modulumfang? – NathanOliver

+0

Innerhalb der Übersetzungseinheit (dh die cpp-Datei + inklusive Header). Wären sie nicht als "statisch" gekennzeichnet worden, hätte ich "global" gesagt. –

Antwort

0

Linker versuchte, zu clever zu sein und Code zu entfernen, von dem er dachte, dass er nicht aufgerufen wurde, aber indirekt aufgerufen würde.

Hinzufügen von Befehlszeilenoptionen in dem Netbeans Linker-Optionen-Dialog rund um die Bibliothek

-Wl, - Ganzkörper-Archiv lib -Wl, - no-ganze-Archiv ...

löst das Problem. Yuk.

+0

W1? Machst du Witze? -Wl. –

+0

@KonstantinVladimirov lol, Spaß mit Schriftarten (merkt sich die Codierungsregel, nie 'l' als Variable zu verwenden) –