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 не может объединить две статические библиотеки.

Вы знаете, как это сделать?

Ответ 2

Как и в CMake 2.8.8, вы можете сделать это, используя тип библиотеки OBJECT. См. комментарий mloksot. Старая ситуация заключалась в том, что каждая цель имела свой собственный каталог, а CMake создавал бы каждый зависимый объект для каждой цели. Это защищает от случая, когда один исходный файл может использоваться несколько раз с разными CFLAGS. (Обратите внимание, что по умолчанию CMake более консервативен, чем automake здесь: automake остановит повторное использование объектных файлов для разных целей только в том случае, если цели построены с разными CFLAGS (и, вероятно, CPPFLAGS тоже).