由于项目要求使用QT5版本,以往在QT4下编译的CTK需要重新编译,但是CMake在编译的时候一直默认选择了QT4版本进行编译,并没有给出CTK_QT_VERSION选项让我进行QT版本的选择,而在将QT4从环境变量中移除后,出现错误:
CMake Error at CMake/ctkMacroSetupQt.cmake:81(message):
error: Qt4 was not found on your system. You probably need to set the
QT_QMAKE_EXECUTABLE variable
Call Stack (most recent call first):
CMakeLists.txt:410 (ctkMacroSetupQt)
并且提示找了一个不适合的QT版本(说QT5 是unsuitable?)
然后根据错误提示找到CTK目录下的CMake/ctkMacroSetupQt.cmake文件,文件内容如下:
###########################################################################
#
# Library: CTK
#
# Copyright (c) Kitware Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0.txt
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
###########################################################################
#! \ingroup CMakeUtilities
macro(ctkMacroSetupQt)
set(CTK_QT_VERSION "4" CACHE STRING "Expected Qt version")
mark_as_advanced(CTK_QT_VERSION)
set_property(CACHE CTK_QT_VERSION PROPERTY STRINGS 4 5)
if(NOT (CTK_QT_VERSION VERSION_EQUAL "4" OR CTK_QT_VERSION VERSION_EQUAL "5"))
message(FATAL_ERROR "Expected value for CTK_QT_VERSION is either '4' or '5'")
endif()
if(CTK_QT_VERSION VERSION_GREATER "4")
cmake_minimum_required(VERSION 2.8.12)
find_package(Qt5 COMPONENTS Core)
set(CTK_QT5_COMPONENTS Core Xml XmlPatterns Concurrent Sql Test)
if(CTK_ENABLE_Widgets OR CTK_LIB_Widgets OR CTK_LIB_CommandLineModules/Frontend/QtGui OR CTK_BUILD_ALL OR CTK_BUILD_ALL_LIBRARIES)
list(APPEND CTK_QT5_COMPONENTS Widgets OpenGL UiTools)
endif()
if(CTK_LIB_CommandLineModules/Frontend/QtWebKit OR CTK_BUILD_ALL OR CTK_BUILD_ALL_LIBRARIES)
if(TARGET Qt5::WebKitWidgets)
list(APPEND CTK_QT5_COMPONENTS WebKitWidgets)
else()
list(APPEND CTK_QT5_COMPONENTS WebEngineWidgets)
endif()
endif()
if(CTK_LIB_XNAT/Core OR CTK_BUILD_ALL OR CTK_BUILD_ALL_LIBRARIES)
list(APPEND CTK_QT5_COMPONENTS Script)
endif()
find_package(Qt5 COMPONENTS ${CTK_QT5_COMPONENTS} REQUIRED)
mark_as_superbuild(Qt5_DIR) # Qt 5
# XXX Backward compatible way
if(DEFINED CMAKE_PREFIX_PATH)
mark_as_superbuild(CMAKE_PREFIX_PATH) # Qt 5
endif()
else()
set(minimum_required_qt_version "4.6")
find_package(Qt4)
if(QT4_FOUND)
if("${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}" VERSION_LESS "${minimum_required_qt_version}")
message(FATAL_ERROR "error: CTK requires Qt >= ${minimum_required_qt_version} -- you cannot use Qt ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH}.")
endif()
set(QT_USE_QTNETWORK ON)
set(QT_USE_QTSQL ON)
set(QT_USE_QTOPENGL ON)
set(QT_USE_QTXML ON)
set(QT_USE_QTXMLPATTERNS ON)
set(QT_USE_QTTEST ${BUILD_TESTING})
include(${QT_USE_FILE})
# Set variable QT_INSTALLED_LIBRARY_DIR that will contains
# Qt shared library
set(QT_INSTALLED_LIBRARY_DIR ${QT_LIBRARY_DIR})
if(WIN32)
get_filename_component(QT_INSTALLED_LIBRARY_DIR ${QT_QMAKE_EXECUTABLE} PATH)
endif()
mark_as_superbuild(QT_QMAKE_EXECUTABLE) # Qt 4
else()
message(FATAL_ERROR "error: Qt4 was not found on your system. You probably need to set the QT_QMAKE_EXECUTABLE variable")
endif()
endif()
mark_as_superbuild(CTK_QT_VERSION)
endmacro()
在里面,我们可以很容易看出,这个方法对QT版本的判断是先判断QT版本(MAJOR_VERSION)是否高于4,如果是不高于4的版本,再判断QT4版本是否高于4.6,而报错信息是再检测QT4版本的代码块,而我电脑上现在只有QT5,这时候出现了错误说明在
if(CTK_QT_VERSION VERSION_GREATER "4")
处判断的结果为false,而CTK_QT_VERSION的数值是在
set(CTK_QT_VERSION "4" CACHE STRING "Expected Qt version")
set_property(CACHE CTK_QT_VERSION PROPERTY STRINGS 4 5)
两个地方进行了赋值的,上面一个是初始化,下面的是在CMake中添加属性供我们选择,但是由于第一次Configure之后并没有给我们属性框进行QT版本的选择,而set_property(CACHE CTK_QT_VERSION PROPERTY STRINGS 4 5)默认选中了第一项“4”,所以在CMake检测到我们选择了QT4版本的情况下,发现电脑环境中只有QT5,因此报出以上错误。
所以,出现该错误时可以分两种情况解决:
第一种是CMake gui给出了属性选择,在CMake gui中选择合适的QT版本
第二种是CMake gui在第一次generate后报错后没有给出属性选择,则可以在CTK/CMake/ctkMacroSetupQt.cmake文件中手动修改,将set_property(CACHE CTK_QT_VERSION PROPERTY STRINGS 4 5)改成set_property(CACHE CTK_QT_VERSION PROPERTY STRINGS 5 4),这样CMake在Configure时会默认选中QT5版本,如果在修改后还是出现上述错误,则同时将set(CTK_QT_VERSION "4" CACHE STRING "Expected Qt version")改为set(CTK_QT_VERSION "5" CACHE STRING "Expected Qt version")
目前这种错误是发生在win10环境中,在win7环境中编译时,第一次Configure后给出了CTK_QT_VERSION选项供选择QT版本,当然,也可能是因为我win7系统的电脑中也有QT4.8.6环境,因此在第一次Configure时选择QT4没有出错,然后给出了选项选择QT版本,对此我就没有再去试验了