CMake: как объявить файл зависимым от CMakeLists.txt? [Дубликат]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

1
задан skybow 21 July 2015 в 18:37
поделиться

2 ответа

Там хороший трюк, который делает именно то, что вам нужно. Это основано на идее, которую я нашел в модуле git-revision @rpavlik , см. Это так: вопрос

. Это общая идея:

  • Создайте файл временной метки времени
  • Добавьте пользовательскую команду, которая касается метки времени, когда файл входа .pri изменяется
  • , включает файл временной метки в вашем CMakeLists.txt

Возможная реализация:

set(input_pri_file <path-to-the-input-pri-file>)
set(timestamp_file ${CMAKE_CURRENT_BINARY_DIR}/timestamp.cmake)

add_custom_command(
    OUTPUT ${timestamp_file}
    COMMAND ${CMAKE_COMMAND} -E touch ${timestamp_file}
    MAIN_DEPENDENCY ${input_pri_file}
    VERBATIM
    COMMENT "Updating timestamp.cmake"
)

if(NOT EXISTS "${timestamp_file}")
    file(WRITE ${timestamp_file} "") # create initial empty file
endif()
include(${timestamp_file})

# create the file list from input_pri_file
....
# use the file list
add_executable(main ${filelist})

Вот что происходит при изменении файла .pri:

  • изменение запускает выполнение пользовательской команды
  • , который обновляет метку времени
  • , потому что CMakeLists включает в себя временную метку, которая зависит от нее
  • , поэтому обновление временной метки запускает повторную настройку CMakeLists.txt
1
ответ дан Community 19 August 2018 в 14:04
поделиться

Я использую configure_file () , если у меня есть некоторый ввод, который должен перезапустить процесс настройки CMake. См. Как сделать реконфигурирование CMake зависимым от пользовательского файла? и unit_file () unit test

Так что в вашем случае это будет выглядеть примерно так:

configure_file(SomeInput.pri ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri)

Затем вы используете ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri для генерации источников. Просто убедитесь, что вы не добавили COPYONLY, потому что тогда конфигурация не будет перезапускаться при изменениях SomeInput.pri.

EDIT: Альтернативно использовать - относительное новое дополнение - CMAKE_CONFIGURE_DEPENDS .

0
ответ дан Florian 19 August 2018 в 14:04
поделиться
Другие вопросы по тегам:

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