CMake: повторно использовать объектные файлы, созданные для библиотеки, в другую цель библиотеки - PullRequest
23 голосов
/ 23 февраля 2011

Я пытаюсь переместить свой проект в CMake, и в то же время оптимизировать процесс компиляции.

Вот предложение:

  • У меня есть несколько подкаталоговкаждый из которых (должен быть) скомпилирован в статическую библиотеку (это работает).
  • Я хочу собрать все объектные файлы из каждого подкаталога в другую большую, полную, статическую библиотеку.

Это выглядит так:

.
libBig.a  # made from object from subdir1 and subdir2
subdir1/
   src/
   libSubdir1.a
subdir2/
   src/
   libSubdir2.a

Сегодня мне удалось использовать глобальную переменную, в которую каждый подпапка CMakeLists.txt будет добавлять свои собственные исходные файлы.Я использую эту переменную как «исходный» вход в моей большой библиотеке:

# the big library depends on all the source files
# ${all_src} is automatically filled with each subdir's cpp file
get_property( BigLib_src GLOBAL PROPERTY all_src)
add_library( Big STATIC ${BigLib_src}) # recompiles all the sources

Теперь, это работает, не так уж плохо, но дело в том, что все мои исходные файлы компилируются дважды : один раз для библиотеки subdir и один раз для большой библиотеки.

Кажется, что CMake забыл, что он их уже собрал.

I имеет для хранения подкаталога.библиотеки и ar не могут объединить две статические библиотеки.

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

Ответы [ 2 ]

28 голосов
/ 17 мая 2012

Вы можете использовать новую библиотечную функцию OBJECT, представленную в CMake 2.8.8 .Идея объясняется здесь .По сути, библиотека OBJECT похожа на концепцию вспомогательной библиотеки , известной в Autotools для группировки объектных файлов.

Проверьте полное руководство CMake Библиотека OBJECT .

3 голосов
/ 24 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...