У меня есть проект, который раньше представлял собой гигантский набор исходных файлов, которые были скомпилированы и затем связаны как один исполняемый файл. В качестве первого шага, чтобы сделать проект более модульным, я разбил сборку на несколько более мелких частей и сделал их статическими библиотеками. Существует иерархия, поэтому Exe1 будет связывать статические библиотеки Lib2A и Lib2B. Lib2A будет зависеть от статического Lib3A, lib3B, lib3C и т. Д. Числа здесь показывают их слой в иерархии.
Проблема в том, что мне нужно использовать --whole-archive при компоновке, иначе некоторые символы из базовых библиотек не найдены.
Когда я добавляю ниже для связывания Exe1:
target_link_libraries(Exe1 -Wl,--whole-archive Lib2A Lib2B -Wl,--no-whole-archive)
В результате я получаю команду этапа реальной ссылки, например:
g++ -o Exe1 -Wl,--whole-archive libLib2A.a libLib2B.a -Wl,--no-whole-archive libLib3A.a libLib3B.a libLib3C.a
Неизбежно, символы из некоторых статических библиотек уровня 3 теряются, и я пропускаю ошибки символов.
Я ожидал, что поскольку Lib2A имеет библиотеки Lib3 * в качестве зависимостей, они также будут "внутри" части --whole-archive команды компоновщика, но они отображаются снаружи.
Я пробовал много разных комбинаций (например, поместил материал --whole-archive на нижние уровни), но не сталкивался с подходом, который работает с использованием CMake. Что я делаю не так?
Спасибо