połączenie własnej rejestracji, abstrakcyjnej fabryki
Pracuję i testuję samorejestracyjną, abstrakcyjną fabrykę opartą na opisanej tutaj:
https://stackoverflow.com/a/582456
We wszystkich moich przypadkach testowych działa jak urok i zapewnia funkcje i ponowne użycie, których chciałem.
Łączenie w tej fabryce w moim projekcie przy użyciu cmake było dość skomplikowane (choć wydaje się być większym problemem).
Mam identyczny base.hpp, derivat.hpp / cpp i odpowiednik deriva.hpp / cpp na przykład połączony. W main po prostu tworzę instancję fabryki i dwukrotnie wywołuję createInstance (), raz z „DerivedA” i „DerivedB”.
Plik wykonywalny utworzony przez linię:
<code>g++ -o testFactory main.cpp derivedb.o deriveda.o </code>
działa zgodnie z oczekiwaniami. Przenoszenie moich pochodnych klas do biblioteki (przy użyciu cmake, ale przetestowałem to również z samym ar), a następnie linkowanie kończy się niepowodzeniem:
<code>ar cr libbase.a deriveda.o derivedb.o g++ -o testFactory libbase.a main.cpp </code>
wywołuje tylko pierwszą instancję statyczną (z derivA.cpp) i nigdy drugą instancję statyczną, tj.
<code>// deriveda.cpp (if listed first in the "ar" line, this gets called) DerivedRegister<DerivedA> DerivedA::reg("DerivedA"); // derivedb.cpp (if listed second in the "ar" line, this does not get called) DerivedRegister<DerivedB> DerivedB::reg("DerivedB"); </code>
Zauważ, że zamiana dwóch w linii ar wywołuje tylko instancję statyczną derivb.cpp, a nie instancję instancea.cpp.
Czy brakuje mi czegoś z ar lub statycznymi bibliotekami, które w jakiś sposób nie grają ładnie ze zmiennymi statycznymi w C ++?