设置c++语言标准
set(CMAKE_CXX_STANDARD 14)
CMAKE_CXX_STANDARD是cmake规定的标准变量,可取的值参考官方文档:
CXX_STANDARD — CMake 3.29.2 Documentation
基本上从值上就能退出将要使用的C++语言标准,如98代表c++98,11代表c++11,20代表c++20,这里使用c++14标准。
set(CMAKE_CXX_STANDARD_REQUIRED ON)
CMAKE_CXX_STANDARD_REQUIRED 是一个布尔值变量,用于指定是否强制使用 CMAKE_CXX_STANDARD 中设置的 C++ 版本。如果设置为 ON,那么 CMake 会要求编译器必须支持 CMAKE_CXX_STANDARD 中设置的 C++ 版本,否则会配置失败。如果设置为 OFF 或者未设置,那么如果编译器不支持 CMAKE_CXX_STANDARD 中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本。
cmake install
cmake install是 cmake工具中重要部分,主要功能是将构建目标、文件、文件夹、脚本等安装到指定位置,详细内容请参考官方文档:
install — CMake 3.29.2 Documentation
有一篇知乎文章请大家参考:
CMake Install:深度解析与实践 - 知乎 (zhihu.com)
CMake官方教程,关于install和ctest有示例介绍:
Step 5: Installing and Testing — CMake 3.29.2 Documentation
install命令基本结构为:
install(<TYPE> files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP])
设置安装路径前缀
CMAKE_INSTALL_PREFIX:cmake安装前缀,用于install命令所有<dir>的前缀。
QGC 顶层 CMakeLists.txt有关于 install 规定:
if(LINUX)
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/AppDir/usr)
else()
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/staging)
endif()
以上代码含义是:如果是linux系统将安装前缀设置为:build目录/AppDir/usr(没有则自动创建)
如果非linux系统,将安装前缀设置为:build目录/staging
执行安装命令
在Qt Creator 完成build之后,不会自动进行安装工作,打开Desktop_Qt_6_7_0_MinGW_64_bit-Debug文件夹(${CMAKE_BINARY_DIR}),在终端输入:
cmake --install .
执行完安装命令之后,产生新的文件夹 staging,有内容如下:
对照顶层 CMakeLists.txt 如下代码:
install(
TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
BUNDLE DESTINATION .
)
动态库安装到lib目录,可执行文件安装到bin目录,静态库文件安装到lib目录。需要注意的是顶层只有add_executable命令,并没有add_library所以在执行顶层CMakeLists.txt产生的cmake_install.cmake之后,不会产生lib目录,将会产生bin目录用来存放生成的可执行文件。
安装qml程序必备qml模块
因为QGC是一个使用了 qml 的应用程序,所以在运行前需要安装 qml 模块。在顶层 CMakeLists.txt中,有如下安装qml模块的命令:
qt_generate_deploy_qml_app_script(
TARGET ${PROJECT_NAME}
OUTPUT_SCRIPT deploy_script
# DEPLOY_TOOL_OPTIONS
MACOS_BUNDLE_POST_BUILD
NO_UNSUPPORTED_PLATFORM_ERROR
DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM
)
根据qt官方文档,qt_generate_deploy_qml_app_script | Qt QML 6.7.1此命令作用是产生QML应用程序的部署脚本文件,要求:
find_package(Qt6 REQUIRED COMPONENTS Qml)
TARGET:指定可执行文件名称。
OUTPUT_SCRIPT:指定deploy脚本名称。
MACOS_BUNDLE_POST_BUILD:当目标是macOS bundle时,此选项启用额外步骤,创建一个构建后规则,此规则使用部署脚本去部署QML模块,以允许应用程序直接从构建目录运行,其他平台忽略此选项。
NO_UNSUPPORTED_PLATFORM_ERROR:对qt_deploy_runtime_dependencies不支持平台调用qt_generate_deploy_qml_app_script将导致致命错误,除非声明了NO_UNSUPPORTED_PLATFORM_ERROR。
DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM:即使当前平台不支持qt_generate_deploy_qml_app_script,但有此声明仍可以安装QML模块。
QGC顶层CMakeLists.txt紧跟着qt_generate_deploy_qml_app_script,完成deploy_script的调用:
install(SCRIPT ${deploy_script})
根据Qt官方文档,在使用GNU安装布局后,除了macOS app bundle,其它所有平台,将qmldir和qml模块插件安装在:
${ CMAKE_INSTALL_PREFIX }/qml
安装资源文件目录
在QGC顶层CMakeLists.txt有安装资源目录的语句:
install(
DIRECTORY ${CMAKE_SOURCE_DIR}/resources/
DESTINATION ${CMAKE_INSTALL_DATADIR}/qgroundcontrol
)
以上的含义是,将${CMAKE_SOURCE_DIR}/resources文件夹,整体复制到${CMAKE_INSTALL_DATADIR}/qgroundcontrol位置,CMAKE_INSTALL_DATADIR是指:
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/qgroundcontrol
本机上${CMAKE_INSTALL_DATADIR},表示/share:
其它Linux安装事项
configure_file(
${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.metainfo.xml.in
${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml
@ONLY
)
configure_file命令可参考CMake官方文档
configure_file — CMake 3.29.2 Documentation
作用是将文件复制到另一个位置,并修改@xxx@中xxx内容。
例如CMakeLists.txt定义一个变量
set(cmake_build_version 2)
输入文件(xx.xx.in)中
#define BUILD_VERSION @cmake_build_version@
那么在输出文件(xx.xx)将会自动生成
#define BUILD_VERSION 2
QGC此处调用configure_file作用主要是根据
${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.metainfo.xml.in
产生一个xml文件:
${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml
并根据 CMakeLists.txt 或者 .cmake 文件修改 .xml.in 内所有 @ xxx @ 包含的变量:
使用vs code搜索REL_DATE和REL_VERSION:
处于注释状态,因此将不会替换 REL_DATE 和 REL_VERSION。
install(
FILES ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
)
以上代码表示:
${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop
安装到:
${CMAKE_INSTALL_PREFIX}/share/applications
install(
FILES ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml
DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo/
)
以上代码表示:
${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml
安装到:
${CMAKE_INSTALL_PREFIX}/share/metainfo/
可以看出,因为本机处于win32环境,并没有进行安装。
install(
FILES ${CMAKE_SOURCE_DIR}/resources/icons/qgroundcontrol.png
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/
RENAME org.mavlink.qgroundcontrol.png
)
同样表示将
${CMAKE_SOURCE_DIR}/resources/icons/qgroundcontrol.png
安装到:
${CMAKE_INSTALL_PREFIX}/share/ icons/hicolor/128x128/apps/
并重命名为 org.mavlink.qgroundcontrol.png
Win32环境下其它安装事项
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateWinInstaller.cmake")
以上表示将调用
${CMAKE_SOURCE_DIR}/cmake/CreateWinInstaller.cmake
进行win32环境下安装工作,查看此.cmake文件:
主要工作是:
将cmake格式表示的资源文件路径,转换为本机环境使用路径;
查找QGC安装命令程序 QGC NSIS
调用QGC NSIS,将安装,卸载QGC等功能注册到windows