Vinculación de un auto-registro, fábrica abstracta.

He estado trabajando y probando una fábrica abstracta de registro automático basada en la que se describe aquí:

https://stackoverflow.com/a/582456

En todos mis casos de prueba, funciona como un encanto, y proporciona las funciones y la reutilización que quería.

Conectar esta fábrica en mi proyecto usando cmake ha sido bastante complicado (aunque parece ser más un problema de ar).

Tengo el idéntico base.hpp, derivado b.hpp / cpp, y un derivado derivado.hpp / cpp equivalente al ejemplo vinculado. En general, simplemente hago una instancia de la fábrica y llamo a createInstance () dos veces, una cada una con "DerivedA" y "DerivedB".

El ejecutable creado por la línea:

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

Funciona como se espera. Trasladar mis clases derivadas a una biblioteca (usando cmake, pero también he probado esto con ar solo) y luego falla el enlace:

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

solo llama a la primera instanciación estática (de derivada A.cpp) y nunca a la segunda instanciación estática, es decir,

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

Tenga en cuenta que el intercambio de los dos en la línea ar llama solo a la instanciación estática derivada de b.cpp, y no a la instanciación derivada.cpp.

¿Me estoy perdiendo algo con ar o bibliotecas estáticas que de alguna manera no funcionan bien con variables estáticas en C ++?

Respuestas a la pregunta(1)

Su respuesta a la pregunta