Возможно стоит добавить голосовалку при оставлении комментария верхнего уровня, хотя что-то в последнее время много комментариев уровня "очень полезно, автор красавчик" даже под некорпоративными статьями.
VTK пилит Kitware, так что вряд ли у них плохой CMake. Он не плохой, он объёмный и там много фич с кучей зависимостей, которые в случае с CPM придется разруливать вам.
Попробуйте, например, VTK добавить через CPM. Ну или CPython. А ещё лучше VTK с поддержкой python. Я не говорю, что это невозможно, в конце концов принцип работы у всех одинаковый. Просто в случае с vcpkg это кто-то уже сделал и оно тестируется, а в случае с CPM это придётся делать самостоятельно.
Пока ваше дерево зависимостей имеет глубину 1-2, пока используемые библиотеки ведут себя нормально, все работает. Дальше CPM начинает испытывать трудности и они сами предлагают использовать vcpkg в таком случае. В какой-то момент поймал себя на мысли, что мне проще написать рецепт для vcpkg, чем в очередной раз разбираться с тем, как для какой-то библиотеки собрать зависимости и как ей потом подсунуть флаги компиляции - vcpkg решает это за меня, причем кроссплатформенно.
Некоторые библиотеки экспортируют таргеты без namespace и с namespace. Вроде, libpng раньше экспортировал png и PNG::PNG. При использовании первого о возможной ошибке вы узнаете только во время компиляции, а при использовании второго - ещё на этапе конфигурации.
Совет 0: пользуйтесь пакетными менеджерами. Например, vcpkg зачастую подсказывает, как использовать библиотеку. Совет 1: ищите библиотеки через find_package. В приоритете использование cmake-конфига. Если его нет, можно попробовать встроенные в cmake find-модули. Если их нет можно попробовать pkg_check_modules (на windows тоже работает, но нужно где-то раздобыть pkgconf). Если вы, как и автор, пользуетесь FetchContent, подгоняйте своё использование под официальное (в принципе, в доках к FetchContent об этом пишут). Совет 2: пользуйтесь экспортированными таргетами. Имена таргетов обычно указывают в документации или в примерах использования, в худшем случае можно посмотреть в cmake-конфиге. Совет 3: пользуйтесь namespaced-таргетами.
Пример без шаблонов - Qt, где при написании чего-то вроде for (auto & el : cont) произойдет копирование всего контейнера, если он не const (из-за CoW).
Единственное полезное применение
std::for_each- это вместе сstd::execution. Все остальное хуже, чем обычный цикл for.Предлагаю вам взяться за теорему Ферма.
Лучше
vcpkg install qtbase qtdeclarative, иначе будет больно от сборки qtwebengine.Возможно стоит добавить голосовалку при оставлении комментария верхнего уровня, хотя что-то в последнее время много комментариев уровня "очень полезно, автор красавчик" даже под некорпоративными статьями.
VTK пилит Kitware, так что вряд ли у них плохой CMake. Он не плохой, он объёмный и там много фич с кучей зависимостей, которые в случае с CPM придется разруливать вам.
Попробуйте, например, VTK добавить через CPM. Ну или CPython. А ещё лучше VTK с поддержкой python.
Я не говорю, что это невозможно, в конце концов принцип работы у всех одинаковый. Просто в случае с vcpkg это кто-то уже сделал и оно тестируется, а в случае с CPM это придётся делать самостоятельно.
Пока ваше дерево зависимостей имеет глубину 1-2, пока используемые библиотеки ведут себя нормально, все работает. Дальше CPM начинает испытывать трудности и они сами предлагают использовать vcpkg в таком случае.
В какой-то момент поймал себя на мысли, что мне проще написать рецепт для vcpkg, чем в очередной раз разбираться с тем, как для какой-то библиотеки собрать зависимости и как ей потом подсунуть флаги компиляции - vcpkg решает это за меня, причем кроссплатформенно.
Не нужны. Если без этого не работает - что-то криво настроили или не почистили CMakeCache.txt.
90% ошибок из-за двух вещей:
Вместо использования предоставленного vcpkg тулчейна, как указано в документации, люди натравливают CMake прямо на папку vcpkg_installed.
При использовании тулчейна указывают его после вызова
project(), то есть слишком поздно.Какие библиотеки будут собираться решается триплетом.
https://learn.microsoft.com/en-us/vcpkg/concepts/triplets
В вашем случае это будет x64-windows-static или x64-windows-static-md, если ваш проект линкуется с CRT динамически.
PS: PNG с недавних пор сам экспортирует свои таргеты и это учтено в usage, обновитесь :)
Некоторые библиотеки экспортируют таргеты без namespace и с namespace. Вроде, libpng раньше экспортировал png и PNG::PNG. При использовании первого о возможной ошибке вы узнаете только во время компиляции, а при использовании второго - ещё на этапе конфигурации.
Я называю этот феномен "покупайте мою книжку", потому что в той самой книге это всё есть :)
Professional CMake by Craig Scott.
Совет 0: пользуйтесь пакетными менеджерами. Например, vcpkg зачастую подсказывает, как использовать библиотеку.
Совет 1: ищите библиотеки через find_package. В приоритете использование cmake-конфига. Если его нет, можно попробовать встроенные в cmake find-модули. Если их нет можно попробовать pkg_check_modules (на windows тоже работает, но нужно где-то раздобыть pkgconf). Если вы, как и автор, пользуетесь FetchContent, подгоняйте своё использование под официальное (в принципе, в доках к FetchContent об этом пишут).
Совет 2: пользуйтесь экспортированными таргетами. Имена таргетов обычно указывают в документации или в примерах использования, в худшем случае можно посмотреть в cmake-конфиге.
Совет 3: пользуйтесь namespaced-таргетами.
Чтобы что?
Такое чувство, что комитет покусал кто-то из Microsoft, потому что там тоже релизят малоюзабельное нечто и потом много лет допиливают.
Уж лучше вообще никак.
В том issue написано, что STL не знает, когда фикс выпустится. Решение об этом принимает другая команда.
Обновитесь, по-моему в GCC 12.1 исправили.
UPD: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95048
Пример без шаблонов - Qt, где при написании чего-то вроде
for (auto & el : cont)произойдет копирование всего контейнера, если он не const (из-за CoW).Вроде не апрель на дворе. Не смешно.
Хабру вообще уже пофиг что публиковать и куда.
https://cmake.org/cmake/help/latest/command/target_sources.html#file-sets