#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 файла (это означает, что у вас может быть несколько целей в одном файле).