使用 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、AUTOMOC
和AUTOUIC
,您的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