我有一个静态工厂,它依靠自身的静态成员将类注册到工厂系统中。
class Foo_A_Maker : public FooFactory<Foo, const std::string &>
{
private:
// Register this as a type using a static instance of itself.
// This is really the only time it is created. That's why the
// constructor is private.
Foo_A_Maker() : FooFactory("Foo_A") {}
static const Foo_A_Maker registerThis;
public:
virtual std::shared_ptr<Foo> MakeProduct(const std::string& params) const;
};
这在我的所有项目中都有效多年,但现在我已将它添加到静态库中。在静态库中,构造函数永远不会被调用,对象也永远不会注册。如果我将此代码放入 exe 项目中,它会再次运行。我通过引入链接时间错误确定这不是链接。
我错过了什么吗?我可以强制链接吗?如果我跨编译边界使用它,EXE 项目可以添加自己的工厂吗?
谢谢大家。
最佳答案
这就是库应该如何工作的——链接器只接受它需要的符号(从外部引用)。解决此问题的正确 方法是提供一个初始化函数。
对于 Visual Studio,您可以找到所需的确切符号名称,并将 /INCLUDE
作为命令行选项传递给链接器。您可以使用 /OPT:NOREF
尝试 - 听起来它可以工作,但还没有测试过。
关于c++ - 静态对象未链接到 VC 2010 中的静态库中。如何强制链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339107/