У меня есть статическая библиотека, которая генерируется из многих файлов cpp на linux с использованием g ++. один заголовочный файл содержит класс, который реализует шаблон фабрики
псевдокод в заголовочном файле, как показано ниже
class Factory
{
public:
static Factory& instance();
Base * create(const std::string& name);
template<class T>
void register_class(const std::string& name);
}
template <class T>
class FactoryRegister
{
public:
FactoryRegister(const std::string& name)
{
Factory::instance().register_class<T>(name);
}
}
Файл
cpp для Factory имеет свои реализации. в другом файле cpp Derive.cpp есть класс, который я хочу зарегистрировать в Factory. и я определил глобальную переменную, чтобы сделать это. код как показано ниже
FactoryRegister<Derive> g_register_derive("derive");
все эти файлы скомпилированы в одну статическую библиотеку и связаны с одним исполняемым файлом.
Насколько я понимаю, поскольку на g_register_derive не ссылается ни один код, он не должен быть связан с исполняемым файлом, если не указана опция целого архива.
странная часть в том, что если я помещу g_register_derive в Derive.cpp, то это правда, что этот символ не связан с исполняемым файлом. но если я помещу g_register_derive в Factory.cpp, он будет связан с исполняемым файлом.
Я использовал nm для проверки результата, и есть также строка кодовых вызовов Factory::instance().create("Derive")
, которая также может использоваться для проверки, связан ли g_register_derive или нет.
и, конечно, если я предоставил опцию «целый архив», g_register_derive всегда будет связан с исполняемым файлом.