我有一个静态库,是在Linux上使用g++从许多cpp文件生成的。一个头文件包含一个实现工厂模式的类。
以下是头文件中的伪代码:
Factory的cpp文件有实现。在另一个cpp文件Derive.cpp中,我想要将一个类注册到Factory中。我定义了一个全局变量来实现这个。代码如下:
所有这些文件都被编译成一个静态库,并链接到一个可执行文件中。
我的理解是,由于 g_register_derive 没有被任何代码引用,除非提供了整个存档选项,否则它不应该被链接到可执行文件中。
奇怪的是,如果我把 g_register_derive 放在 Derive.cpp 中,确实这个符号就不会被链接到可执行文件中。但是如果我把 g_register_derive 放在 Factory.cpp 中,它就会被链接到可执行文件中。
我使用 nm 来验证结果,并且还有一行代码调用 Factory::instance().create("Derive"),也可以用来检查 g_register_derive 是否已被链接。
当然,如果我提供了整个存档选项,g_register_derive 将始终被链接到可执行文件中。
以下是头文件中的伪代码:
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);
}
}
Factory的cpp文件有实现。在另一个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 将始终被链接到可执行文件中。