Поиск…


Вступление

Пользовательские шаги сборки полезны для запуска пользовательских целей в вашей сборке проектов или для простого копирования файлов, поэтому вам не нужно делать это вручную (возможно, dll?). Здесь я покажу вам два примера: первый - для копирования DLL (в частности, библиотек Qt5) в двоичный каталог проектов (Debug или Release), а второй - для запуска пользовательской цели (Doxygen в этом случае) в вашем решении (если вы используете Visual Studio).

замечания

Как вы можете видеть, вы можете много сделать с пользовательскими целями сборки и шагами в cmake, но вы должны быть осторожны при их использовании, особенно при копировании DLL. Хотя это удобно, оно иногда может привести к тому, что ласково называется «dll hell».

В основном это означает, что вы можете потеряться, в каких DLL-файлах зависит ваш исполняемый файл, какие из них загружаются и какие из них ему нужно запустить (возможно, из-за переменной пути вашего компьютера).

Помимо вышеперечисленного, не стесняйтесь делать индивидуальные цели, делая все, что хотите! Они мощные и гибкие и являются бесценным инструментом для любого проекта cmake.

Пример копирования dll Qt5

Предположим, у вас есть проект, который зависит от Qt5, и вам нужно скопировать соответствующие DLL в каталог сборки, и вы не хотите делать это вручную; вы можете сделать следующее:

cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project

# add the executable
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
    
add_custom_command(TARGET MyQtProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
    )

Итак, каждый раз, когда вы строите свой проект, если целевые DLL-файлы были изменены, которые вы хотите скопировать, они будут скопированы после того, как ваша цель (в этом случае основной исполняемый файл) будет построена (обратите внимание на команду copy_if_different ); в противном случае они не будут скопированы.

Кроме того, обратите внимание на использование выражений генератора . Преимущество использования этих компонентов заключается в том, что вам не нужно явно указывать, где копировать DLL или какие варианты использовать. Чтобы иметь возможность использовать их, проект, который вы используете (Qt5 в этом случае), должен иметь импортированные цели.

Если вы создаете отладочную версию, то CMake знает (на основе импортированной цели) скопировать Qt5Cored.dll, Qt5Guid.dll и Qt5Widgetsd.dll в папку Debug вашей папки. Если вы создаете в выпуске, то версии выпуска .dll будут скопированы в папку выпуска.

Запуск пользовательской цели

Вы также можете создать настраиваемую цель для запуска, когда хотите выполнить определенную задачу. Обычно это исполняемые файлы, которые вы запускаете для выполнения разных действий. Что-то, что может быть особенно полезно, - запустить Doxygen для создания документации для вашего проекта. Для этого вы можете сделать следующее в вашем CMakeLists.txt (для простоты мы рассмотрим пример проекта Qt5):

cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project

add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
    
add_custom_command(TARGET MyQtProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
    )

#Add target to build documents from visual studio.
set(DOXYGEN_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
#set the output directory of the documentation
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/docs)
# sanity check...
message("Doxygen Output ${DOXYGEN_OUTPUT_DIR}")
find_package(Doxygen)

if(DOXYGEN_FOUND)
    # create the output directory where the documentation will live
    file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
    # configure our Doxygen configuration file. This will be the input to the doxygen
    # executable
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
    ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)

# now add the custom target. This will create a build target called 'DOCUMENTATION' 
# in your project
ADD_CUSTOM_TARGET(DOCUMENTATION
  COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..."
  COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
  COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  COMMAND ${CMAKE_COMMAND} -E echo "Done."
  WORKING_DIRECTORY ${DOXYGEN_OUTPUT_DIR})

endif(DOXYGEN_FOUND)

Теперь, когда мы создаем наше решение (опять же, предполагая, что вы используете Visual Studio), у вас будет цель сборки, называемая DOCUMENTATION которую вы можете создать для восстановления документации вашего проекта.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow