Краткий ответ: сообщите CMake, что между его целями есть зависимость.
target_link_libraries(my_program PRIVATE SOMELIB SOMELIBmain)
CMake оценит местоположения SOMELIB для вас и свяжет my_program
с SOMELIB
и SOMELIBmain
[1] .Работает как с конфигурациями Debug и Release, так и с Linux.
Вам не нужно беспокоиться о том, где CMake размещает файлы сборки [2] , и это так называемый "современный CMake"пытаясь достичь.Я оставлю здесь только краткое описание, но проверьте ссылку внизу ответа [3] .
В любом случае, ключевая концепция заключается в том, что всякий раз, когда вы создаете библиотеку / исполняемый файл (цель), вы перечисляетеего использование + требования к построению и зависимости от других целей.Вы объявляете зависимости, используя target_link_libraries(<your_lib> KEYWORD <dependencies>)
.Такая строка не только сделает <you_lib>
ссылку на перечисленные зависимости, она унаследует их требования к использованию (обычно это общедоступные каталоги) и прикажет CMake создавать зависимые библиотеки до <your_lib>
.
Вся прелесть этогочто даже если SOMELIB
не соответствует современным идеям CMake (не объявляет требования к сборке / использованию), вы все равно должны иметь возможность делать только с этой одной строкой.
[1] Я предположил, что цели CMake названы так же, как имена выходных библиотек, но это не обязательно.В случае с OP выяснилось, что к статическим целевым библиотекам добавляется -static
, поэтому ему пришлось написать SOMELIB-static SOMELIBmain-static
[2] К сожалению, с разделяемыми библиотеками это не так простов Windows (DLL)
[3] Я бы начал с этой записи в блоге: https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/