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 ++?

questionAnswers(1)

yourAnswerToTheQuestion