我一直在使用和测试一个基于此处描述的自注册抽象工厂:
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++ 中不能很好地处理静态变量?