库上的静态变量初始化

jac*_*ack 7 c++ static-libraries static-linking

我正在开发一个将添加类型的工厂,但是,如果该类没有在执行的.exe中明确地被编程(编译时),那么该类型不会添加到工厂中.这是因为静态调用是如何不进行的.有没有人对如何解决这个问题有任何建议?下面是我放入lib的五个非常小的文件,然后一个.exe将调用这个lib.如果有任何关于如何使其工作的建议,或者可能是更好的设计模式,请告诉我.这基本上就是我要找的东西

1)可以采用类型的工厂

2)自动注册进入类.cpp文件,任何和所有注册码都应该在类.cpp中(对于下面的示例,RandomClass.cpp)而没有其他文件.

BaseClass.h:http://codepad.org/zGRZvIZf

RandomClass.h:http://codepad.org/rqIZ1atp

RandomClass.cpp:http://codepad.org/WqnQDWQd

TemplateFactory.h:http://codepad.org/94YfusgC

TemplateFactory.cpp:http://codepad.org/Hc2tSfzZ

APr*_*mer 8

当您与静态库链接时,实际上是从中提取目标文件,这些目标文件提供当前使用但未定义的符号.在您使用的模式中,可能没有由目标文件提供的未定义符号,该文件包含触发注册的静态变量.

解决方案:

  • 使用显式注册
  • 以某种方式由编译单元提供未定义的符号
    • 使用链接器参数将静态变量添加为未定义的符号
    • 有用的东西,但这通常不自然
    • 一个虚拟的,如果主程序提供它是不自然的,作为链接器参数它主要比使用静态变量的错位名称更容易
  • 使用链接器参数声明必须包含库的所有对象
  • 动态库是完全导入的,因此没有这个问题


Lin*_*cer 6

作为一般经验法则,应用程序不包含库中的静态或全局变量,除非它们被应用程序隐式或显式使用.

有几百种不同的方法可以重构.一种方法可以是将静态变量放在函数中,并确保调用该函数.