¿Hay alguna manera de obligar al compilador de c ++ a no optimizar objetos estáticos específicos en una biblioteca estática?

(Solo necesita trabajar para gcc 5.4, si no se puede encontrar una solución general)

Tengo una fábrica genérica que utilizo para construir objetos basados en alguna clave (como una cadena que representa un nombre de clase). La fábrica debe permitir el registro de clases que pueden no conocerse en el momento de la construcción (por lo que no puedo simplemente registrar una lista de clases explícitamente).

Como medio para registrar estas claves y sus constructores asociados, tengo otra clase 'RegisterInFactory' (con plantilla). En el archivo fuente de cada clase, construyo un objeto en un espacio de nombres anónimo correspondiente a esa clase. De esta manera, cada clase se registra automáticamente en la fábrica una vez que se construyen los objetos globales. Estos objetos nunca se usan o hacen referencia fuera de esta tarea de registro inicial.

Sin embargo, cuando el código se compila en una biblioteca estática, cuando esa biblioteca está vinculada a un ejecutable, estos objetos estáticos nunca se construyen, por lo que las clases no se registran en la fábrica y la fábrica no puede crear nada.

Soy consciente de la-Wl,--whole-archive -lfoo bandera, que incluye estos objetos globales. Pero también introduce muchos errores de 'definición múltiple'. Soy consciente de que hay otra marca que puedo desactivar los errores de definición múltiple, pero no me siento cómodo sin esos errores. Soy consciente de-u symbolName para desactivar nombres de símbolos específicos de estos errores de definición múltiple (al menos eso creo). Sin embargo, hay demasiadas funciones redundantes para que sea realista (principalmente de clases protobuf).

¿Hay alguna forma de decirle al compilador que no optimice esos objetos, sino solo esos objetos para que pueda evitar el problema de definición múltiple? ¿Hay otro patrón que pueda seguir que se ajuste a las restricciones? (Particularmente que no sé en el momento de la compilación qué clases pueden registrarse en la fábrica).

Código de ejemplo simplificado: Factory.h:

template<Base>
class Factory{
  ...
  template<Derived>
  class RegisterInFactory{
    RegisterInFactory(){
      instance().regInFactory(derivedConstructorFunctional);
    }
  };
};

En Derived.cpp:

namespace{ BaseFactory::RegisterInFactory<Derived> registerMe{"Derived"}; }

Nota final: he tenido suerte hasta cierto punto, sin las banderas de enlace, todavía se incluyen, pero la única forma en que parece suceder es si la clase Derivada es "suficientemente" complicada. O tal vez sea si uso la clase Derivada directamente dentro del ejecutable vinculado. Realmente no puedo decir por qué funcionó cuando lo ha hecho.

Respuestas a la pregunta(2)

Su respuesta a la pregunta