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