CMake: файлы объектов повторного использования, созданные для lib в другую цель lib
Я пытаюсь переместить свой проект на CMake и в то же время оптимизировать процесс компиляции.
Здесь сделка:
- У меня есть несколько поддиров, которые (должны быть) скомпилированы в статическую библиотеку (это работает).
- Я хочу собрать все объектные файлы из каждого поддира в другую большую, старую библиотеку.
Он выглядит следующим образом:
.
libBig.a # made from object from subdir1 and subdir2
subdir1/
src/
libSubdir1.a
subdir2/
src/
libSubdir2.a
Сегодня мне удалось использовать глобальную переменную, в которой каждый subdir CMakeLists.txt будет добавлять свои собственные исходные файлы. Я использую эту переменную как "исходный" вход в моей большой библиотеке:
# the big library depends on all the source files
# ${all_src} is automatically filled with each subdir cpp file
get_property( BigLib_src GLOBAL PROPERTY all_src)
add_library( Big STATIC ${BigLib_src}) # recompiles all the sources
Теперь это работает, не так уж плохо, но дело в том, все мои исходные файлы скомпилированы дважды: один раз для библиотеки subdir и один раз для большой библиотеки.
CMake, похоже, забывает, что он уже их создал.
Мне нужно сохранить библиотеки subdir и ar
не может объединить две статические библиотеки.
Вы знаете, как это сделать?
Ответы
Ответ 1
Вы можете использовать новую библиотечную функцию OBJECT, представленную в CMake 2.8.8. Идея объясняется здесь здесь. В принципе, библиотека OBJECT похожа на концептуальную библиотеку известную из Autotools, для группировки объектных файлов.
Проверьте полный учебник CMake OBJECT.
Ответ 2
Как и в CMake 2.8.8, вы можете сделать это, используя тип библиотеки OBJECT
. См. комментарий mloksot. Старая ситуация заключалась в том, что каждая цель имела свой собственный каталог, а CMake создавал бы каждый зависимый объект для каждой цели. Это защищает от случая, когда один исходный файл может использоваться несколько раз с разными CFLAGS
. (Обратите внимание, что по умолчанию CMake более консервативен, чем automake здесь: automake остановит повторное использование объектных файлов для разных целей только в том случае, если цели построены с разными CFLAGS
(и, вероятно, CPPFLAGS
тоже).