我一直使用和測試自行註冊,抽象工廠根據這裏所描述的:鏈接自行註冊,抽象工廠
https://stackoverflow.com/a/582456
在我所有的測試案例,它的工作原理像一個魅力,並提供了我想要的功能和重用。
在我的項目中使用cmake鏈接這個工廠一直非常棘手(儘管它似乎更像是一個問題)。
我有相同的base.hpp,derivedb.hpp/cpp和等效的deriveda.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
只要求第一個靜態實例(從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++中的靜態變量播放?
非常感謝,這讓我走上了正確的道路。爲了將來的參考,這也有所幫助(感謝在整個檔案庫中改進了search-foo!) http://stackoverflow.com/a/842770/1322752 – 2012-04-09 22:25:14