Как создать библиотеку CMake, исходный код которой хранится в подкаталогах?

#c #cmake

#c #cmake

Вопрос:

Я пытаюсь настроить проект CMake, который создает статическую библиотеку из источников, хранящихся в подкаталогах. Как сделать это правильно, более гибко и иметь возможность добавлять новые файлы / каталоги в будущем.

У меня есть следующая структура каталогов для этой библиотеки:

 library

      include

            network
                  socket.h
                  server.h
                  CMakeFiles.txt

            application.h
            CMakeFiles.txt

      src
            network
                  socket.cpp
                  server.cpp
                  CMakeFiles.txt

            application.cpp
            CMakeFiles.txt

      lib
            (here should be a library.a file after compilation)

      CMakeFiles.txt   
  

Комментарии:

1. Зачем вам нужен CMake в каждом подкаталоге?

Ответ №1:

Если вы создаете уникальную библиотеку, просто создайте ее CMakeLists.txt . Вам не нужно по одному на папку. Это был бы правильный гибкий способ обработки вашего случая.

Одна переменная для исходных текстов, одна переменная для заголовков (используется для процедуры установки).

Комментарии:

1. Я думал только об одной переменной для источников и еще одной для заголовков, но я подумал, что эту переменную следует каким-то образом распространить на каждую CMakeLists.txt в подкаталогах, и эти sub-CMakeLists.txt файлы должны заполнять эти переменные

2. Просто перечислите файлы для каждой папки. Это то, что рекомендуется, и вы видите свои исходные файлы в одном файле, это гораздо более устойчиво, чем несколько файлов, добавляющих исходные файлы в общую библиотеку.

3. @G-Virus FILE GLOB Также можно контролировать сбор исходных файлов.

4. Спасибо, ребята, это работает. Но, пожалуйста, скажите мне еще раз, почему это более предпочтительно, чем отдельные файлы? Это также хорошо для проектов с большим количеством файлов?

5. Да, это лучше, у вас есть одно центральное местоположение, где вы знаете, что вы включили. Вы не можете забыть библиотеку. Кроме того, когда вы возвращаетесь из add_subdirectory , вы теряете заданные вами переменные, поэтому вам нужно будет взломать это в вашем процессе сборки, что было бы некрасиво. Просто используйте эмпирическое правило: 1 цель = не более 1 файла (это означает, что у вас может быть несколько целей в одном файле).