Начиная с CMake версии 2.8.8, вы можете использовать «библиотеки объектов» , чтобы избежать дублирования компиляции объектных файлов . Используя пример библиотеки Кристофера Брунса с двумя исходными файлами:
# list of source files
set(libsrc source1.c source2.c)
# this is the "object library" target: compiles the sources only once
add_library(objlib OBJECT ${libsrc})
# shared libraries need PIC
set_property(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1)
# shared and static libraries built from the same object files
add_library(MyLib_shared SHARED $<TARGET_OBJECTS:objlib>)
add_library(MyLib_static STATIC $<TARGET_OBJECTS:objlib>)
Из CMake документов :
Библиотека объектов компилирует исходные файлы, но не архивирует и не связывает
их объектные файлы в библиотеку. Вместо других целей, созданных
add_library()
или add_executable()
могут ссылаться на объекты, используя
выражение вида $<TARGET_OBJECTS:objlib>
как источника, где
objlib - это имя библиотеки объектов.
Проще говоря, команда add_library(objlib OBJECT ${libsrc})
указывает CMake скомпилировать исходные файлы в *.o
объектные файлы. Эта коллекция файлов *.o
затем упоминается как $<TARGET_OBJECT:objlib>
в двух командах add_library(...)
, которые вызывают соответствующие команды создания библиотеки, которые создают общие и статические библиотеки из одного и того же набора объектных файлов. Если у вас много исходных файлов, то компиляция файлов *.o
может занять довольно много времени; с помощью библиотек объектов вы компилируете их только один раз.
Цена, которую вы платите, состоит в том, что объектные файлы должны создаваться как позиционно-независимый код, потому что это требуется для разделяемых библиотек (статические библиотеки не заботятся). Обратите внимание, что позиционно-независимый код может быть менее эффективен, поэтому, если вы стремитесь к максимальной производительности, вам следует использовать статические библиотеки. Кроме того, легче распространять статически связанные исполняемые файлы.