уточнение : Если приведенная ниже настройка является разумным способом сделать это, то мой вопрос в основном, как мне лучше всего добавить публичные заголовки с помощью .lib при запуске ninja install поскольку мое решение не делает этого в настоящее время.
Существует множество примеров того, как делать вещи по-разному, и многие, кажется, противоречат друг другу, просто еще больше сбивая меня с толку.
Я пытаюсь изменить внутреннюю систему сборки и заменить ее на CMake.База кода состоит из множества различных компонентов / библиотек, таких как абстракция ОС / платформы, работа в сети, функциональные возможности и т. Д. До этого она всегда была скомпилирована как одна большая база кода, поэтому запуск команды clean удалял все и перестраивал все зависимости.
Теперь доходит до того, что у меня возникают проблемы с пониманием того, как современный умный способ сделать это в CMake.
Игнорируя тот факт, что сверху необходим инструмент цепочки зависимостей, моя идея заключалась в том, чтобы собирать компоненты / библиотеки в порядке библиотек, не зависящих от самого верха при выполнении изолированной сборки.Затем каждый отдельный сборочный прогон будет собираться со своими зависимостями, как, например, только Windows API для библиотеки абстракции ОС, и затем запускать установку и экспорт на нем.
- Это общий предпочтительный способ компиляциибиблиотеку в .lib на windows или .a на linux и экспортировать ее в известную общую папку?
- Я предполагаю, что тогда потребуется скопировать все общедоступные заголовочные файлы для этой библиотеки в то же место?Если да, то как это сделать наиболее правильно?
Если у меня есть структура папок абстракции моей ОС
OSabstraction/
includes/
OSabstraction/
abstraction.h
src/
abstraction.cpp
CMakeLists.txt
и мой CMakeLists
cmake_minimum_required(VERSION 3.12)
project(OSabstraction LANGUAGES CXX)
add_library(abstraction)
target_sources(abstraction
PRIVATE
src/abstraction.cpp
)
target_include_directories(abstraction
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/>
$<INSTALL_INTERFACE:include>
)
install(
TARGETS abstraction
EXPORT abstraction-export
ARCHIVE DESTINATION lib
)
Каклучше бы я использовать эту библиотеку во многих других внутренних проектах?Эта библиотека на практике во много раз больше, так что как правильно сделать это для большого проекта?
edit: я пытался следовать руководству Пабло Ариаса о том, как сделать CMake Right , но я не уверен, как работают генераторы build_interface и install_interface в отношении получения моих заголовочных файлов при экспорте файла .lib.