связывание с собственной -регистрирующей абстрактной фабрикой

Я работал и тестировал само -регистрирующую абстрактную фабрику, основанную на описанной здесь:

https://stackoverflow.com/a/582456

Во всех моих тестовых случаях, он работает как шарм и предоставляет функции и повторное использование, которые я хотел.

Связывание этой фабрики в моем проекте с использованием cmake было довольно сложным (, хотя, похоже, это скорее проблема с ar ).

У меня есть файлы base.hpp, производныеb.hpp/cpp и эквивалентные производные.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

вызывает только первый статический экземпляр (из производногоA.cpp )и никогда не второй статический экземпляр, т.е.

// deriveda.cpp (if listed first in the "ar" line, this gets called)
DerivedRegister DerivedA::reg("DerivedA");

// derivedb.cpp (if listed second in the "ar" line, this does not get called)
DerivedRegister DerivedB::reg("DerivedB");

Обратите внимание, что замена двух строк в строке ar вызывает только статическую реализацию производногоb.cpp, а не реализацию производного.cpp.

Я что-то упустил с ar или статическими библиотеками, которые каким-то образом плохо работают со статическими переменными в C++?

7
задан Community 23 May 2017 в 11:44
поделиться