C++ 在VC 2010中,静态对象未链接到静态库中。如何强制链接?
我有一个静态工厂,它依靠自身的静态成员将类注册到工厂系统中C++ 在VC 2010中,静态对象未链接到静态库中。如何强制链接?,c++,factory-pattern,static-linking,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
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;
};
class Foo\u A\u制造商:公共食品工厂
{
私人:
//使用其自身的静态实例将其注册为类型。
//这确实是唯一一次创建它。这就是为什么
//构造函数是私有的。
Foo_A_Maker():FooFactory(“Foo_A”){}
静态常量Foo_A_Maker register此;
公众:
虚拟std::shared_ptr MakeProduct(const std::string¶ms)const;
};
这已经在我所有的项目中使用多年了,但现在我已经将它添加到了一个静态库中。在静态库中,从不调用ctor,也从不注册对象。如果我把这个代码放在exe项目中,它会再次工作。我已通过引入链接时间错误确定这不是链接
我错过什么了吗?我可以强制链接吗?如果我跨编译边界使用它,EXE项目是否可以添加自己的工厂
谢谢大家。这就是libs的工作原理-链接器只接受它需要的符号(从外部引用)。解决这个问题的正确方法是提供一个init函数
对于Visual Studio,您可以找到所需的确切符号名称,并将
/INCLUDE
作为命令行选项传递给链接器。您可以尝试使用/OPT:NOREF
-听起来似乎可以工作,但还没有测试过它。类定义中的静态成员变量需要与该类之外的同一变量匹配(我不清楚每个部分的确切术语)。这意味着在类之外的某个CPP文件中,您需要编写以下内容:
Foo_A_Maker Foo_A_Maker::registerThis;
这是对象被创建的点(它在任何程序中工作而没有这一点有点奇怪)。把这个放在一个CPP文件中,你应该会没事的
您还应该能够将其放入CPP文件中,而不将其声明为类中的静态成员。这将是更容易的路线。也就是说,删除static并将其放入CPP文件中:
Foo_A_Make registerThis;
我经常使用它的原因是你没有写标题。整个类生活在一个cpp中,只能通过基本接口类访问。由于调用代码不需要更改,而且实际上无法更改,因为它没有头,所以不可能向下转换并易于扩展。如果我将tiff添加到图像族中,数据现在可以包含tiff,项目只需重新链接,而不需要重新编译。@Tavison:我自己也在使用相同的注册机制。它在静态库中无法正常工作。谢谢。C++似乎对静态LIBS有敌意。动态绑定会解决这个问题还是会增加更多的问题?动态库会起作用-链接器在创建动态库时不知道将使用哪些符号,所以它不会删除任何东西是的,我会这样做。我只是没有在上面的代码中包含它,因为正如你所说,它在任何情况下都不起作用。