cmake enable g ++ -std = c ++ 11 [duplicate]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

9
задан PierreBdR 13 October 2014 в 13:56
поделиться

2 ответа

Я попытался установить CMAKE_C_FLAGS

Согласно документации , CMAKE_C_FLAGS установил флаги языка C для всех типов сборки . Для C ++ вам нужно использовать CMAKE_CXX_FLAGS вместо:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
18
ответ дан Gluttton 18 August 2018 в 05:55
поделиться
  • 1
    Где находятся переменные CMAKE_CXX_FLAGS? Я не слишком хорошо знаком с CMake. – hlin117 10 January 2015 в 17:56
  • 2
    @ hlin117, 'CMAKE_CXX_FLAGS' находится в файле «CMakeLists». – Gluttton 10 January 2015 в 18:08
  • 3
    Я заметил, как неясно, как мой вопрос был после того, как я опубликовал его, извините. Я хотел спросить, в строке set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") второй CMAKE_CXX_FLAGS должен быть инициализирован до его ссылки (используя $), но где он инициализирован? (Я не могу представить, что переменная инициализируется и ссылается на одну и ту же строку.) – hlin117 10 January 2015 в 18:12
  • 4
    @ hlin117, короткий ответ: вам не стоит беспокоиться о предыдущей инициализации или объявлении таких переменных. Если переменная существует, она будет использоваться, если нет, то будет заменена пустая строка. Обычно эта форма объявления позволяет изменять значение существующей переменной вместо переписывания. – Gluttton 10 January 2015 в 18:32
  • 5
    Чтобы включить C ++ 14, я попробовал -std=c++14, но он не работает. Есть идеи? – becko 24 July 2015 в 20:34

Для CMake 3.1 или более поздней версии вы можете установить переменную CMAKE_CXX_STANDARD на 11:

Значение по умолчанию для свойства CXX_STANDARD целевых объектов.

Эта переменная используется для инициализации свойства CXX_STANDARD для всех целей.

CXX_STANDARD documentation :

Стандарт C ++, чьи функции запрашиваются для создания этой цели.

Это свойство указывает стандарт C ++, чьи функции запрашиваются для создания этой цели. Для некоторых компиляторов это приводит к добавлению в строку компиляции флага типа -std=gnu++11.

Поддерживаемые значения: 98, 11 и 14.

Если запрашиваемое значение не приводит к при добавлении флага компиляции для используемого компилятора вместо этого будет добавлен предыдущий стандартный флаг. Это означает, что использование:

set_property(TARGET tgt PROPERTY CXX_STANDARD 11)

с компилятором, который не поддерживает -std=gnu++11 или эквивалентный флаг, не приведет к ошибке или предупреждению, но вместо этого добавит флаг -std=gnu++98, если он поддерживается. Это поведение «распада» можно контролировать с помощью целевого свойства CXX_STANDARD_REQUIRED .

См. Руководство cmake-compile-features (7) для получения информации на компилируемых функциях.

Это свойство инициализируется значением переменной CMAKE_CXX_STANDARD, если оно задано при создании цели.

9
ответ дан Casey 18 August 2018 в 05:55
поделиться
  • 1
    Что делать, если я хочу -std=c++11, а не -std=gnu++11, как CXX_STANDARD 11 различает эти два? – Ela782 3 November 2015 в 22:08
Другие вопросы по тегам:

Похожие вопросы: