Вопрос по c++, cmake – связывание саморегистрационной, абстрактной фабрики

7

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

https://stackoverflow.com/a/582456

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

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

У меня есть идентичный 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

вызывает только первое статическое создание экземпляра (из outputA.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 вызывает только статическое создание производного bb, а не создание производного.cpp.

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

Ваш Ответ

1   ответ
10

The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again.

g++ -Wl,-whole-archiveg++ -all_load.

g++ -o testFactory -Wl,-whole-archive libbase.a -Wl,-no-whole-archive main.cpp

-Wl,-no-whole-archive

Большое спасибо, это поставило меня на правильный путь. Для дальнейшего использования это также помогло (благодаря улучшенному поиску-foo для всего архива!)stackoverflow.com/a/842770/1322752 Ethan Coon

Похожие вопросы