#windows #build #compilation #cmake #libraries
#Windows #сборка #Сборник #cmake #библиотеки
Вопрос:
Я не понимаю, зачем нам нужен cmake для создания библиотек? Извините, если мой вопрос глупый, но мне нужно использовать некоторые библиотеки в Widnows, и какую бы библиотеку я ни выбрал, мне нужно ее собрать и / или скомпилировать с помощью cmake.. Для чего это нужно? Почему я не могу просто #включить «путь» к тому, что мне нужно в мой проект, и чем он может быть скомпилирован / собран одновременно с моим проектом?
А также, иногда мне нужно было установить Ruby, Perl, Python, все они имеют определенную версию, чтобы cmake мог создавать библиотеки… Зачем мне нужны эти программы, и понадобятся ли они мне только для создания библиотеки или позже в моем проекте? (могу ли я удалить эти программы после создания библиотек?)
Комментарии:
1. «Почему я не могу просто #включить «путь» к тому, что мне нужно в мой проект, и чем он может быть скомпилирован / собран одновременно с моим проектом?» — Звучит так, как будто вы даже не понимаете, какие части составляют библиотеку и как она включена впрограмма. Здесь вам нужно освоиться с основами. В любом случае, если библиотеке требуется CMake (не бойтесь использовать веб-поиск), это происходит потому, что это инструмент, который она выбрала для управления своей системой сборки.
Ответ №1:
Создание чего-либо на c на разных платформах в настоящее время представляет собой беспорядок.
Существует несколько различных систем сборки, и стандартного способа сделать это не существует. Простое предоставление решения Visual Studio не поможет компиляции на linux или mac.
Если вы добавляете makefile для linux или mac, вам необходимо повторить настройки между решением и makefile. Что может привести к большим затратам на техническое обслуживание. Кроме того, make-файлы на самом деле не являются хорошим инструментом сборки по сравнению с новыми существующими.
То, что у вас есть только библиотеки CMake, в основном является совпадением. Тем не менее, CMake в настоящее время является популярным выбором.
Существует несколько решений для унификации сборок. CMake — это инструмент сборки особым образом. Он может создавать make-файлы и создавать их, но вы также можете указать cmake создать решение Visual Studio, если хотите.
То же самое относится и к внешним программам. Это выбор сопровождающего библиотеки, которую вы используете, и нет никаких стандартов для таких вещей, как генерация кода.
Хотя CMake, возможно, и не является «правильным» решением (хотя предстоящая версия Visual studio 2015 интегрирует поддержку cmake), тенденция к кроссплатформенным системам сборки все больше и больше развивается в этом направлении.
На ваш вопрос, почему вы не можете включить только заголовок:
Несколько библиотек имеют только заголовок и должны быть скомпилированы. Либо вы можете получить предварительно скомпилированные библиотеки / библиотеки DLL и просто включить заголовок добавить путь компоновщика. В Linux это проще, потому что у вас могут быть -dev
пакеты, которые просто устанавливают предварительно созданную библиотеку и ее заголовок через менеджер пакетов. В Windows такого нет изначально.
Или вы должны собрать его самостоятельно с помощью любого buildtool, используемого библиотекой.
Комментарии:
1. «В Windows такого нет изначально». — Родной или нет, Visual Studio использует NuGet для той же цели, делая развертывание зависимостей одинаково простым. Это «менеджер пакетов для платформы разработки Microsoft» . Что классного в NuGet: Это единственный менеджер пакетов, извлекающий пакеты с одного URL-адреса. Вы найдете гораздо меньше ресурсов для поиска «устранения неполадок NuGet» , чем для менеджеров пакетов Linux.
2. Мне нравится ваше резюме, просто хотел добавить несколько ссылок: поддержка CMake в Visual Studio , Архитектура приложений с открытым исходным кодом: CMake и о CMake .
3. @IInspectable спасибо за упоминание NuGet. Я еще не работал с ним, поэтому не смог ничего добавить по этой теме.
Ответ №2:
Короткий ответ заключается в том, что у вас его нет, но, вероятно, было бы сложно создать проект без него.
CMake не создает код, а вместо этого является генератором файлов сборки. Он был разработан KitWare (во время проекта ITK около 2000 года), чтобы упростить создание кода на нескольких платформах. Это непростой язык в использовании (что Kitware открыто признает), но он объединяет несколько вещей, которые Windows, Mac и Linux делают по-разному при создании кода.
- В Linux autoconf обычно используется для создания файлов сборки, которые затем компилируются с помощью gcc / g (и / или clang)
- В Windows вы обычно используете среду IDE Visual Studio и создаете то, что они называют «решением», которое затем компилируется msvc (компилятором Microsoft Visual C )
- На Mac я признаю, что не знаком с используемым компилятором, но я считаю, что это как-то связано с XCode
CMake позволяет вам написать один скрипт, который вы можете использовать для сборки на нескольких компьютерах, и указать разные параметры для каждого.
Как и C , CMake был разделен на традиционный / устаревший CMake (версия <3.x) и современный CMake (версия> = 3.0). Используйте современный CMake. Ниже приведены отличные учебные пособия:
- Эффективный CMake, Даниэль Пфейфер, C Now 2017*
- Современные шаблоны CMake, автор Матей Ропер, CppCon 2017
- Лучше CMake
- Учебное пособие по CMake
* Награжден самым полезным докладом на конференции C Now 2017
Просмотрите их в указанном порядке. Вы узнаете, как выглядит современный CMake (и CMake старого образца), и получите представление о том, как
- CMake помогает указать порядок сборки и зависимости, а
- Современный CMake помогает предотвратить создание циклических зависимостей и распространенных ошибок при масштабировании до более крупных проектов.
Кроме того, в последнем видео представлены менеджеры пакетов для C (полезные при использовании внешних библиотек, например Boost
, для использования команды CMake find_package()
), из которых два наиболее распространенных:
В общем,
- Думайте о целевых объектах как об объектах
a. Есть два вида, исполняемые файлы и библиотеки, которые «сконструированы» с
add_executable(myexe ...) # Creates an executable target "myexe"
add_library(mylib ...) # Creates a library target "mylib"
- У каждой цели есть свойства, которые являются переменными для цели. Однако они указаны с подчеркиванием, а не точками, и (часто) используют заглавные буквы
myexe_FOO_PROPERTY # Foo property for myexe target
- Функции в CMake также могут устанавливать некоторые свойства для целевых «объектов» (под капотом) при запуске
target_compile_definitions()/features()/options()
target_sources()
target_include_directories()
target_link_libraries()
- CMake — это командный язык, похожий на сценарий оболочки, но в нем нет вложенности или компоновки команд. Вместо
a. Каждая команда (функция) находится в отдельной строке и выполняет одно
b. Аргументами для всех команд (функций) являются строки
c. Если имя цели явно не передано функции, команда применяется к цели, которая была создана последней
add_executable(myexe ...) # Create exe target
target_compile_definitions(...) # Applies to "myexe"
target_include_directories(...) # Applies to "myexe"
# ...etc.
add_library(mylib ...) # Create lib target
target_sources(...) # Applies to "mylib"
# ...etc.
d. Команды выполняются по порядку, сверху вниз (ПРИМЕЧАНИЕ: если цели требуется другая цель, вы должны сначала создать цель)
- Область выполнения — это текущий активный
CMakeLists.txt
файл. Дополнительные файлы могут быть запущены (добавлены в область видимости) с помощьюadd_subdirectory()
командыa. Это работает во многом как команда командной оболочки
exec
; текущая среда CMake (цели и свойства, кромеPRIVATE
свойств) «копируются» в новую область («оболочку»), где выполняется дополнительная работа.b. Однако «среда» не является средой оболочки (целевые свойства CMake не передаются оболочке как переменные среды, подобные
$PATH
). Вместо этого язык CMake поддерживает все цели и свойства в глобальной области верхнего уровняCACHE
PRIVATE
свойства используются текущим модулем.INTERFACE
свойства передаются в модули подкаталога.PUBLIC
для текущего модуля и подмодулей (свойство подходит для текущего модуля и применяется к / должно использоваться модулями, которые ссылаются на него).target_link_libraries
предназначен для прямых зависимостей модулей, но он также разрешает все транзитивные зависимости. Это означает, что когда вы ссылаетесь на библиотеку, вы также получаете всеPUBLIC
свойства родительских модулей.a. Если вы хотите создать ссылку на библиотеку, к которой есть прямой путь, вы можете использовать
target_link_libraries
, иб. если вы хотите связать модуль с проектом и использовать его интерфейс, вы также используете
target_link_libraries
Вы запускаете CMake для CMakeLists.txt
файлов, чтобы сгенерировать файлы сборки, которые вы хотите для своей системы ( ninja
, Visual Studio solution
, Linux make
и т. Д.), И запускаете их для компиляции и компоновки кода.