静态对象未在VC 2010中的静态库中链接。如何强制链接?

时间:2011-03-17 12:39:24

标签: c++ factory-pattern static-linking

我有一个静态工厂,它依赖于自身的静态成员来将类注册到工厂系统中。

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;
};

这在我的所有项目中已经工作了多年,但现在我已将其添加到静态库中。在静态库中,永远不会调用ctor,并且对象永远不会注册。如果我把这段代码放在exe项目中,它会再次运行。我已经确定这不是通过引入链接时间错误来链接的。

我错过了什么吗?我可以强制链接吗?如果我在编译边界使用它,那么EXE项目可以添加自己的工厂吗?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

这就是libs应该如何工作 - 链接器只接受它需要的符号(从外部引用)。 正确的解决方法是提供init函数。

对于Visual Studio,您可以找到所需的确切符号名称,并将/INCLUDE作为命令行选项传递给链接器。您可以尝试使用/OPT:NOREF - 听起来它可以正常工作,但尚未对其进行测试。

答案 1 :(得分:0)

类定义中的静态成员变量需要与该类之外的相同变量匹配(我不清楚每个部分的确切术语)。这意味着在一些CPP文件中,在类之外,你需要写这个:

Foo_A_Maker Foo_A_Maker::registerThis;

这是创建对象的点(它可以在任何程序中运行而不会有点奇怪)。将其置于其中一个CPP文件中,您应该没问题。

您还应该能够将其置于CPP文件中而不将其声明为类中的静态成员。这将是更容易的路线。也就是说,删除静态并将其放入CPP文件中:

Foo_A_Make registerThis;