我一直使用和测试自行注册,这里描述基于一个抽象工厂:
https://stackoverflow.com/a/582456
在我所有的测试案例,它就像一个魅力,提供的功能和重用我想要的。
在我的项目使用cmake在这家工厂链接已经相当棘手的(尽管它似乎更多的AR的问题)。
我具有相同base.hpp,derivedb.hpp / CPP,具有同等的deriveda.hpp / CPP到示例相连。 在主,我简单地初始化工厂和调用的createInstance()两次,一次每个“DerivedA”和“DerivedB”。
由线创建可执行文件:
g++ -o testFactory main.cpp derivedb.o deriveda.o
按预期工作。 移动我的派生类到库(使用cmake,但我已经与AR单独以及测试这一点),然后链接失败:
ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
只要求第一个静态实例(从derivedA.cpp),从来没有第二个静态实例,即
// deriveda.cpp (if listed first in the "ar" line, this gets called)
DerivedRegister<DerivedA> DerivedA::reg("DerivedA");
// derivedb.cpp (if listed second in the "ar" line, this does not get called)
DerivedRegister<DerivedB> DerivedB::reg("DerivedB");
需要注意的是,在AR线交换两个只调用derivedb.cpp静态实例,而不是deriveda.cpp实例。
我失去了与AR或静态库的东西,不知何故没有发挥好与C ++静态变量?