使用 cmake 构建 Qt5 项目

Posted

技术标签:

【中文标题】使用 cmake 构建 Qt5 项目【英文标题】:build Qt5 project with cmake 【发布时间】:2016-11-16 09:49:19 【问题描述】:

我正在尝试用 cmake 构建一个 Qt5 项目,这是我的 cmake 代码(VS2013 作为生成器):

cmake_minimum_required (VERSION 2.6 FATAL_ERROR)

project      (pcl-visualizer)
set(CMAKE_PREFIX_PATH "C:\\Qt2013\\5.7\\msvc2013_64")
set(VTK_DIR "C:\\Program Files\\PCL 1.8.0\\3rdParty\\VTK\\lib\\cmake\\vtk-7.0")
find_package(Qt5Widgets)
find_package (VTK REQUIRED)
find_package (PCL 1.8 REQUIRED)

include_directories ($PCL_INCLUDE_DIRS)
link_directories    ($PCL_LIBRARY_DIRS)
add_definitions     ($PCL_DEFINITIONS)

include_directories($Qt5Widgets_INCLUDES)
add_definitions($Qt5Widgets_DEFINITIONS)
set(CMAKE_CXX_FLAGS "$Qt5Widgets_EXECUTABLE_COMPILE_FLAGS")
ADD_DEFINITIONS ($QT_DEFINITIONS)

set  (project_SOURCES main.cpp pclviewer.cpp)
set  (project_HEADERS pclviewer.h)
set  (project_FORMS   pclviewer.ui)
set  (VTK_LIBRARIES   vtkRendering vtkGraphics vtkHybrid QVTK)

ADD_DEFINITIONS ($QT_DEFINITIONS)

ADD_EXECUTABLE  (pcl_visualizer $project_SOURCES
                                $project_FORMS_HEADERS
                                $project_HEADERS_MOC)

TARGET_LINK_LIBRARIES (pcl_visualizer $QT_LIBRARIES $PCL_LIBRARIES $VTK_LIBRARIES)

它配置并生成。

-- 配置完成 -- 生成完成 -- 构建文件已写入:C:/ysong/pcl/doc/tutorials/content/sources/qt_visualizer/build 10:40:24: Le processus "C:\Program Files\CMake\bin\cmake.exe" s'est 终端正常化。 10:40:24:不可能 de trouver un Makefile。 Vérifiez vos 编译选项。错误的错误 编译/部署 du projet pcl_visualizer(套件:桌面 Qt 5.6.1 MSVC2013 64bit2) 执行步骤“Make”时 10:40:24: Temps écoulé : 00:01.

但是项目没有构建(没有 ui_pclviewer.h)。我应该怎么做才能完全构建我的项目。

【问题讨论】:

CMake 不构建项目。 CMake 只是准备构建环境。打开 .sln 项目(我假设你在 Windows 上)并从 Visual Studio 构建 是的,我有一个 sln 项目。但是要构建一个 qt 项目,qt 必须将“.ui”文件编译为“ui_.h”文件,以便在 Visual Studio 中使用。我必须手动执行此操作吗? cmake.org/cmake/help/v3.0/manual/… 你可能想要AUTOMOC和AUTOUIC 【参考方案1】:

与this post 一样,首先需要清理您的 CMake 文件。

cmake_minimum_required (VERSION 2.6 FATAL_ERROR)

2.6 太旧了,我敢肯定你真的不需要与旧版本兼容。至少使用2.8.11

set(CMAKE_PREFIX_PATH "C:\\Qt2013\\5.7\\msvc2013_64")

在你的路径中避免使用“\”,迟早你会遇到麻烦。改用“/”,即使在 Windows 上:

set(CMAKE_PREFIX_PATH "C:/Qt2013/5.7/msvc2013_64")

您也可以设置Qt5_DIR 而不是CMAKE_PREFIX_PATH,就像您为 vtk 所做的那样。

不要一一查找每个 Qt 模块:

find_package(Qt5Widgets)
find_package(Qt5Gui)
find_package(Qt5Core)

一键添加:

find_package(Qt5 REQUIRED Widgets)

Widgets 就足够了,因为 Qt 的包文件处理依赖关系。添加REQUIRED 以确保找到包。

使用imported targets、AUTOMOCAUTOUIC,您的cmake 项目应如下所示:

cmake_minimum_required(VERSION 2.8.11)

project(pcl-visualizer)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(Qt5_DIR "C:/Qt2013/5.7/msvc2013_64/lib/cmake/Qt5")
set(VTK_DIR "C:/Program Files/PCL 1.8.0/3rdParty/VTK/lib/cmake/vtk-7.0")
find_package(Qt5 REQUIRED Widgets)
find_package (VTK REQUIRED)
find_package (PCL 1.8 REQUIRED)

include_directories ($PCL_INCLUDE_DIRS)
link_directories    ($PCL_LIBRARY_DIRS)
add_definitions     ($PCL_DEFINITIONS)

set  (project_SOURCES main.cpp pclviewer.cpp)
set  (project_HEADERS pclviewer.h)
set  (project_FORMS   pclviewer.ui)
set  (VTK_LIBRARIES   vtkRendering vtkGraphics vtkHybrid QVTK)

add_executable(pcl_visualizer $project_SOURCES
                              $project_FORMS
                              $project_HEADERS)

target_link_libraries(pcl_visualizer Qt5::Widgets $PCL_LIBRARIES $VTK_LIBRARIES)

【讨论】:

@wasthishelpful,变量$project_FORMS_HEADERS$project_HEADERS_MOC是怎么定义的?它们是从$project_FORMS$project_HEADERS 自动生成的吗?或者这是一个错字?感谢您的澄清。 为了使 CMakeLists 具有可移植性,应将变量设置为系统中的环境变量。这样其他用户就可以编译软件而无需编辑项目的 CmakeLists.txt

以上是关于使用 cmake 构建 Qt5 项目的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像

如何在 MSYS2 中通过 CMake 构建 c++ Qt5 应用程序

cmake qt5_generate_repc() 将 rep 标头放在 CMAKE_CURRENT_BINARY_DIR

Qt 和 CMake 集成

CMake 链接 Qt5::Svg 但 QImageReader 看不到

CMake + Qt 翻译系统的正确工作流程