I statische globale Variablen Konstrukteuren als Trick verwende, um bequem Funktionen zu registrieren, geht die Idee, etwas wie folgt aus:Prevent Linker aus dem Entfernen Globals
typedef int (*FuncPtr)(int);
struct RegHelper
{
RegHelper(const char * Name, FuncPtr Func)
{
Register(Name, Func);
}
}
#define REGISTER(func) RegHelper gRegHelper_ ## func (#func, func);
Jetzt kann ich Funktionen registrieren diese Art und Weise (ich benutze es zu implementieren eine Art Reflexion):
int Foo(int a)
{
return a * 123;
}
REGISTER(Foo)
int Bar(int a)
{
return a * 456;
}
REGISTER(Bar)
das Problem ist, dass, wenn ich dies in einer statischen Bibliothek verwenden, manchmal der Linker erkennt, dass die Übersetzungseinheit nicht verwendet wird, und es fällt die ganze Sache. Also die globalen Variablen sind nicht konstruiert, und die Funktionen sind nicht registriert ...
Meine Frage ist: Was kann ich tun, um dies zu umgehen? Das Aufrufen von Dummy-Funktionen in jeder Kompilierungseinheit während der Initialisierung scheint die Konstruktion der globalen Variablen auszulösen, aber das fühlt sich nicht sehr sicher an. Irgendwelche anderen Vorschläge?
Danke! Das ist nicht genau die Lösung, die ich suche, aber das hilft schon sehr viel :) – Drealmer
Ich renne in genau dieses selbe Problem, aber "Bibliotheksabhängigkeitseingaben verwenden" einzuschalten funktioniert nicht für mich. Meine statische Bibliothek wird mit einer DLL verbunden, wenn das irgendeinen Unterschied macht. – BigSandwich
Ich habe eine neue Antwort hinzugefügt, weil ich das anders gemacht habe. – BigSandwich