cmake编译ctk在qt5环境下的一个错误解决

由于项目要求使用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版本,对此我就没有再去试验了

猜你喜欢

转载自blog.csdn.net/qq_32215819/article/details/81533904
今日推荐