LINUX.ORG.RU

Указание диалекта под виндой

 , ,


0

1

Привет. Проект собирается на онтопике без проблем, используются фичи вплоть до цпп20, диалект задаётся в цмэйке следующим образом:

add_library(compile_flags INTERFACE)
target_compile_features(compile_flags INTERFACE cxx_std_20)

потом с этой целью линкуются все таргеты. Но на винде сборка падает на такой конструкции:

#if !defined(__cplusplus) || __cplusplus < 201703L
#error "Requires complete C++17 support"
#endif

я закомментил это, проект скомпилился. Не так чтобы я прям из штанов выпрыгиваю от желания собрать и перелопатил гору инфы по виндокомпиляции, попробовал и какие-то проблемы на ровном месте. Как правильно задать диалект кроссплатформенно?

★★

Последнее исправление: kvpfs (всего исправлений: 1)

диалект задаётся в цмэйке следующим образом:

А надо вот так:

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_EXTENSIONS FALSE)

Ну или set_property(TARGET target PROPERTY CXX_STANDARD 20)

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)
Ответ на: комментарий от XMs

Чёт не помогает, я влепил в главном цмейке: 3 сет строки, ну и set_property() для таргета с опициями, сборка также падает.

kvpfs ★★
() автор топика
Ответ на: комментарий от XMs

сет строки вначале файла, до определения целей.

kvpfs ★★
() автор топика
Ответ на: комментарий от XMs

Нет, не надо «вот так».

Устанавливать глобальные свойства – плохо, ТС правильно делает, устанавливая только таргетоспецифичные свойства. Использовать target_compile_features – правильно.

Ошибка у ТС, насколько я понимаю, из-за того, что MSVC не выставляет __cplusplus в актуальное значение. Для исправления этой ошибки следует передавать специальный флаг, см. https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=msvc-170

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Устанавливать глобальные свойства – плохо, ТС правильно делает, устанавливая только таргетоспецифичные свойства. Использовать target_compile_features – правильно.

Спорно. У тебя были ситуации использования в одном проекте разных версий стандарта?

Ошибка у ТС, насколько я понимаю, из-за того, что MSVC не выставляет __cplusplus в актуальное значение. Для исправления этой ошибки следует передавать специальный флаг, см. https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=msvc-170

Там выше решение уже есть, взятое отсюда https://gitlab.kitware.com/cmake/cmake/-/issues/18837

rumgot ★★★★★
()
Ответ на: комментарий от Siborgium

Для таких случаев оправдано конечно. Но у меня такое - очень редкие случаи, связанные с костылями. А можно подробнее про твой кейс в котором это используется?

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)
Ответ на: комментарий от rumgot

А можно подробнее про твой кейс такого решения?

Очень просто: подъем версии в части компонентов согласовали, в части – нет. Согласование – процесс небыстрый, а фичи хочется здесь и сейчас.

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Блин, ну тут как-бы не совсем технически обусловлено, а скорее бюрократически.

rumgot ★★★★★
()
Ответ на: комментарий от Siborgium

По поводу глобальности уже ответили, со своей стороны лишь укажу, что ТС предпочитает возню с опциями компилятора вместо выставления свойства цели. Да, с этим оказался баг, но в общем случае вся прелесть cmake как раз в возможности избавиться от этой возни в пользу универсального решения

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.