К сожалению, большинство компоновщиков удаляют все символы из блоков компиляции, если в них нет явного вызова функции.
Вы ошибаетесь: компоновщик, который сделает это, будет сломанлинкер. Компоновщики не код для сбора мусора, который регистрирует глобальные конструкторы или деструкторы.
Наиболее вероятно, что ваши объектные файлы даже не выбраны в ссылку (не извлекаются из архивных библиотек)на первом месте. Это сообщение содержит хорошее объяснение алгоритма, который многие линкеры используют для определения того, что выбрано, а что нет.
Обновление:
Теперь, когдамы видим репро, ваш актуальный вопрос не имеет ничего , связанного с удалением мертвого кода. Как я и подозревал, subscriber.o
просто не извлекается из libsubscriber.a
, потому что компоновщик не находит причин для этого.
Вот фактическая команда ссылки:
/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main libsubscriber.a
Здесьэто команда, которую вы хотите иметь:
/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main \
-Wl,--whole-archive libsubscriber.a -Wl,--nowhole-archive
Я не знаю, как этого добиться с помощью CMake, извините.
В качестве альтернативы, вы также можете достичь желаемого эффекта с помощью:
/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main \
-u _Z19forceLinkSubscriberv libsubscriber.a