Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在VC 2010中,静态对象未链接到静态库中。如何强制链接?_C++_Factory Pattern_Static Linking - Fatal编程技术网

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有敌意。动态绑定会解决这个问题还是会增加更多的问题?动态库会起作用-链接器在创建动态库时不知道将使用哪些符号,所以它不会删除任何东西是的,我会这样做。我只是没有在上面的代码中包含它,因为正如你所说,它在任何情况下都不起作用。