我一直在使用和测试一个基于此处描述的自注册抽象工厂:
https://stackoverflow.com/a/582456 https://stackoverflow.com/a/582456
在我所有的测试用例中,它就像一个魅力,并提供了我想要的功能和重用。
使用 cmake 在我的项目中链接这个工厂非常棘手(尽管它似乎更像是一个 ar 问题)。
我有与链接示例相同的 base.hpp、derivatedb.hpp/cpp 和等效的 obligeda.hpp/cpp。在 main 中,我只是实例化工厂并调用 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
仅调用第一个静态实例化(来自衍生A.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 行中的两者只会调用 derivatedb.cpp 静态实例化,而不是 derivateda.cpp 实例化。
我是否缺少 ar 或静态库中的某些内容,这些库在 C++ 中与静态变量不能很好地配合?