c++ - 静态对象未链接到 VC 2010 中的静态库中。如何强制链接?

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

这在我的所有项目中都有效多年,但现在我已将它添加到静态库中。在静态库中,构造函数永远不会被调用,对象也永远不会注册。如果我将此代码放入 exe 项目中,它会再次运行。我通过引入链接时间错误确定这不是链接。

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

谢谢大家。

最佳答案

这就是库应该如何工作的——链接器只接受它需要的符号(从外部引用)。解决此问题的正确 方法是提供一个初始化函数。

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

关于c++ - 静态对象未链接到 VC 2010 中的静态库中。如何强制链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339107/

相关文章:

c++ - 模板元编程 - 使用 Enum Hack 和 Static Const 的区别

由变量控制的 C++ 调试宏

c# - 如何配置工厂来生成对象?

c# - 弱引用或工厂模式

c++ - 将单声道编译为静态库

linux - 动态链接与静态链接与 PIC 与非 PIC

c++ - Boost.MultiArray 初学者 : How to get a 4D-Array with dynamic inner-array-sizes?

使用默认默认构造函数的 C++11 值初始化

linq-to-sql - 如何在 linq for sql 中使用工厂类?

c++ - 如何判断当前项目是dll还是静态库?