Для того, что вы конкретно запрашиваете, потребуется несколько целей, как уже упоминалось в комментариях / ответе jpo38
Однако вам может быть интересно использовать Библиотеки объектов в CMake для совместного использования объектов. между целью библиотеки и исполняемой целью. Например:
cmake_minimum_required(VERSION 3.16)
project(my_project LANGUAGES CXX)
# Objects get built exactly once
add_library(LibA.objects OBJECTS
A.cpp
)
target_compile_commands( ... )
target_include_directories( ... )
# Shared library for libA
add_library(LibA SHARED
$<OBJECTS:LibA.objects>
)
# LibB -- always shared, always linked against dynamic LibA
add_library(LibB SHARED
B.cpp
)
target_link_libraries(LibB PUBLIC LibA)
# ExecutableA, built using LibA's objects
# (effectively the same linking a static LibA.a)
add_executable(ExecutableA
main.cpp
$<OBJECTS:LibA.objects>
)
Используя библиотеку объектов, ваши объекты создаются один раз, но распределяются между несколькими целями. С другой стороны, использование нескольких библиотечных целей приведет к перестройке каждого объекта, поскольку каждая цель может использовать разные команды компиляции.
Это позволяет ExecutableA
иметь встроенные в него объекты LibA
, поэтому он ведет себя эффективно, как если бы вы статически были связаны в LibA.a
. В этом случае LibA
теперь явно создается как библиотека SHARED
, так как это необходимо для LibB
для динамического связывания с.
Если вы используете более новые версии CMake, вы также можете избегайте выражения генератора $<OBJECTS:...>
и просто связывайте объектную библиотеку напрямую с помощью target_link_libraries
- например:
target_link_libraries(libA PRIVATE LibA.objects)
...
target_link_libraries(ExecutableA PRIVATE LibA.objects)
Этот подход также позволит применять свойства один раз к их соответствующим целям. Любые свойства, касающиеся самих исходных файлов, просто необходимо применить непосредственно к библиотеке объектов. Любые свойства, относящиеся к настройке / макету библиотеки (например, расположение вывода, суффиксы и т. Д. c), применяются строго к целям библиотеки.