ligando uma fábrica abstrata de auto-registro

Eu tenho trabalhado e testado uma fábrica abstrata de autorregistro, baseada na descrita aqui:

https://stackoverflow.com/a/582456

Em todos os casos de teste, funciona como um encanto e fornece os recursos e a reutilização que eu queria.

Ligar esta fábrica no meu projeto usando o cmake tem sido bastante complicado (embora pareça ser mais um problema de ar).

Eu tenho o mesmo base.hpp, derivedb.hpp / cpp e um equivalente deriveda.hpp / cpp para o exemplo ligado. Na principal, simplesmente instancio a fábrica e chamo createInstance () duas vezes, uma vez com "DerivedA" e "DerivedB".

O executável criado pela linha:

<code>g++ -o testFactory main.cpp derivedb.o deriveda.o
</code>

funciona como esperado. Mover minhas classes derivadas para uma biblioteca (usando cmake, mas eu testei isso com ar sozinho também) e, em seguida, a ligação falha:

<code>ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
</code>

apenas chama a primeira instanciação estática (de derivedA.cpp) e nunca a segunda instanciação estática, ou seja,

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

Note que trocar os dois na linha ar chama somente a instanciação estática derivada, e não a instanciação derivada.

Estou faltando alguma coisa com ar ou bibliotecas estáticas que de alguma forma não são legais com variáveis ​​estáticas em C ++?

questionAnswers(1)

yourAnswerToTheQuestion