Исполняемый файл cmake не перестраивается

У меня есть структура проекта следующим образом. A.dll зависит от B.exe, B.exe зависит от настраиваемой цели C. Настраиваемая цель C создает некоторые файлы, которые B.exe упаковывает в архив в качестве шага после сборки на цели B.
При первой сборке A.dll, так как это первая сборка B.exe, а на этапе после сборки создается myArchieve.a. С этого момента, если я соберу A.dll, B.exe не будет перестроен, так как это исполняемый файл, и он существует из-за предыдущей сборки. Проблемы из-за этого:
1. У меня всегда есть устаревший исполняемый файл
2. Если я внесу некоторые изменения в C и запущу сборку A.dll, cmake просто перестроит C и A. Он не перестроит B.exe и в результате пропустит шаг архивирования, и мой архив никогда не обновится.

Есть ли решение этой проблемы? Я уже прочитал эту ссылку и мало чем помогает.


person voidMainReturn    schedule 21.01.2015    source источник


Ответы (2)


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

Вместо этого вы должны использовать add_custom_command для упаковки и иметь это команду DEPENDS как для цели, которая создает B.exe, так и для выходных файлов из вашей пользовательской цели C.

person ComicSansMS    schedule 22.01.2015
comment
Это не сработает, потому что в документации add_custom_command четко указано, что пользовательская команда задается как правило для цели, которая использует свои выходные файлы в качестве исходного файла. Мой вывод, то есть myArchieve.a, не используется в качестве источника какой-либо целью. Следовательно, эта пользовательская команда не будет добавлена ​​ни к одной цели. - person voidMainReturn; 22.01.2015

Я новичок в CMake, и у меня была аналогичная проблема с тем, что exec не перестраивался. Я делюсь своим решением, надеюсь, это будет полезно для будущих читателей.

Примечание. Следующее решение было протестировано с использованием VS 2017 с новой встроенной поддержкой CMake, поэтому решение не создается. Загружается только папка, в которой находится файл CMakeLists.txt верхнего уровня.

Структура папок будет такой:

.
└── A
    ├── B
    │   └── main.cpp
    ├── A.cpp
    └── A.h

Вы можете создать подпапку для B:

# Content of "B/CMakeLists.txt"
project(B)

add_executable( BExec main.cpp)
add_custom_command(TARGET BExec 
                   PRE_BUILD
                   COMMAND cmake -E cmake_autogen ${PROJECT_BINARY_DIR}/CMakeFiles/BExec_autogen.dir Debug)

И тогда вы можете сделать следующее в A:

# Content of CMakeLists.txt for A
project(A)
add_subdirectory(B)

add_library(A A.cpp A.h)
add_dependencies(A BExec)

Каждый раз, когда вы меняете код в main.cpp, A.cpp или A.h, он также перестраивает библиотеку и исполняемый файл. Возможно, не самое элегантное, но рабочее решение.

person Peter Devenyi    schedule 21.05.2018