【发布时间】:2016-01-15 07:41:31
【问题描述】:
我正在尝试从 QMake 切换到 CMake。我的第一个错误是这样的:
Target "aacmakeqt" links to target "Qt::xmlpatterns" but the target was not found.
Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing?
我想知道如何知道或找到模块的名称?为什么是find_package(Qt5Widgets) 而不是find_package(Qt5widgets)?
为什么是target_link_libraries(project Qt5::Widgets) 而不是Qt5::widgets 或Qt5Widgets?我在哪里可以找到这些信息?而最重要的是如何使用链接Qt XML Patterns?
我在 QtCreator 中的 .pro 文件
#-------------------------------------------------
#
# Project created by QtCreator 2015-11-07T19:23:43
#
#-------------------------------------------------
QT += core gui xmlpatterns widgets
TARGET = myapp
TEMPLATE = app
SOURCES += main.cpp .........
HEADERS += mainwindow.h ........
FORMS += mainwindow.ui ........
RESOURCES += resources.qrc
我的 CMakeList 文件
cmake_minimum_required(VERSION 3.0)
## Setting ProjectId by current directory
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
MESSAGE(STATUS "\tProjectId: " ${ProjectId} ) ## Debug Message
## Defining project
project(${ProjectId})
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Find the library
find_package(Qt5Widgets)
find_package(Qt5Xmlpatterns)
MESSAGE(STATUS "Project Source Directory: " ${PROJECT_SOURCE_DIR} ) ## Debug Message
file(GLOB_RECURSE SRC_CPP ${PROJECT_SOURCE_DIR} *.cpp)
MESSAGE(STATUS "\tsource: " ${SRC_CPP}) ## Debug Message
add_executable(${ProjectId} ${SRC_CPP})
# Use the Widgets module from Qt 5.
target_link_libraries(${ProjectId} Qt5::Widgets)
target_link_libraries(${ProjectId} Qt5::xmlpatterns)
解决方案:
通过find_package(Qt5XmlPatterns REQUIRED) 提供的更详细的错误消息,我了解到 CMake 找不到 Qt5XmlPatternsConfig.cmake 或 qt5xmlpatterns-config.cmake。
所需的.cmake 文件应该随Qt 一起提供。事实证明,我的 Qt 目录位于我的主目录中,而不是 \usr\lib。 (我不知道这是怎么发生的。我应该使用默认选项安装 Qt。)
所以,我只是帮助 cmake 找到正确的目录。就我而言,Qt 的所有.cmake 文件都位于~/Qt5.5.1/5.5/gcc_64/lib/cmake 下。
根据find_package的文档,依次搜索CMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH包。所以我只是添加
set(CMAKE_FRAMEWORK_PATH ${CMAKE_FRAMEWORK_PATH} "~/Qt5.5.1/5.5/gcc_64/lib/cmake")
让它正确搜索。
最后我们可以在Your_Qt_Install_directory/Qt5.5.1/5.5/gcc_64/lib/cmake"下找到包名。
【问题讨论】:
-
你可以试试
XmlPatterns而不是xmlpatterns(注意大小写)?在这种情况下,我怀疑它最像 Qt 遵循 CMake 大小写约定。 -
我确实尝试了各种大小写组合
Xmlpatterns,XmlPatterns.... -
CMake 运行的输出是什么?我假设它没有找到 Qt5Xmlpattern。我以为你必须寻找`find_packages(Qt5 COMPONENTS Core Gui Widgets XmlPatterns)`或类似的。
-
对于doc.qt.io/qt-5/cmake-manual.html 中未提及的内容,我认为最好的办法是阅读 FindQt* 脚本的源代码。
-
@FrankOsterfeld 对。网上关于 Qt5 和 CMake 的例子并不多。