如何使用CMake包含特定的Qt安装? 您所在的位置:网站首页 cmake指定install目录 如何使用CMake包含特定的Qt安装?

如何使用CMake包含特定的Qt安装?

2023-10-09 08:36| 来源: 网络整理| 查看: 265

我们在每个开发PC上都有大量的Qt副本-每个项目在thirdparties目录中都有自己的Qt副本。这是因为每个项目都是用自己的Qt开发和测试的;一个常见的情况是,我们需要为一些项目定制一个Qt构建。因此,由于上面提到的,我们有一个单独的SVN repo来保存各种Qt版本,以及每个Qt项目中的一个外部版本,它引用了这些构建中的一个。

问题是,当使用CMake时,我们只能选择Qt的一个版本,而Qt4 finder会自行决定使用哪个Qt。这不是正确的答案。我们需要重定向finder,以便在项目的第三方目录中配置特定Qt副本的所有内容。

我曾尝试为FIND_PACKAGE指定PATHS选项,如下所示:FIND_PACKAGE( Qt4 REQUIRED PATHS "thirdparty/Qt" ),但没有帮助。我曾尝试设置QT_QMAKE_EXECUTABLE变量,但没有成功。在安装QMake之前,我曾尝试将所需的QMake路径( FindQt4.cmake使用它来确定所有目录)添加到path变量,但这也没有帮助。

除了特定的Qt副本之外,有没有办法使用FIND_PACKAGE提供的所有东西?我真的不想手动实现所有的Qt包装器,设置所有的定义、包含、目录等。

这是我的CMake项目。也许这会有所帮助:

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) ############################################################################# MACRO( ADD_FILES_TO_FILTER rootFilterName rootFilterPath files ) FOREACH( curFile ${files} ) FILE( RELATIVE_PATH curFilter "${CMAKE_CURRENT_SOURCE_DIR}/${rootFilterPath}" "${CMAKE_CURRENT_SOURCE_DIR}/${curFile}" ) FILE( RELATIVE_PATH test "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/${curFile}" ) GET_FILENAME_COMPONENT( curFilter ${curFilter} PATH ) SET( curFilter "${rootFilterName}/${curFilter}" ) STRING( REPLACE "/" "\\\\" curFilter ${curFilter} ) SOURCE_GROUP( ${curFilter} FILES ${curFile} ) ENDFOREACH( curFile ) ENDMACRO( ADD_FILES_TO_FILTER rootFilterName rootFilterPath files ) MACRO( TO_RELATIVE_PATHS filePaths ) SET( resPaths "" ) FOREACH( curPath ${${filePaths}} ) FILE( RELATIVE_PATH relPath ${CMAKE_CURRENT_SOURCE_DIR} ${curPath} ) SET( resPaths ${resPaths} ${relPath} ) ENDFOREACH( curPath ) SET( ${filePaths} ${resPaths} ) ENDMACRO( TO_RELATIVE_PATHS filePaths ) ###################################################################### # Define project settings PROJECT( RealTimeCapture ) FIND_PACKAGE( Qt4 REQUIRED PATHS "thirdparty/Qt" ) SET( BOOST_ROOT "thirdparty/boost" ) FIND_PACKAGE( Boost REQUIRED ) # Collect all required files for build FILE( GLOB_RECURSE headers RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/RTCF/include/*.h" ) FILE( GLOB_RECURSE sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/RTCF/src/*.cpp" ) FILE( GLOB_RECURSE resources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.qrc" ) FILE( GLOB_RECURSE forms RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.ui" ) # Preprocess all Qt files QT4_WRAP_CPP( header_mocs ${headers} ) QT4_WRAP_UI( form_headers ${forms} ) QT4_ADD_RESOURCES( resources_rcc ${resources} ) # Convert all generated files paths to relative ones TO_RELATIVE_PATHS( header_mocs ) TO_RELATIVE_PATHS( form_headers ) TO_RELATIVE_PATHS( resources_rcc ) # Create executable ADD_EXECUTABLE( RealTimeCapture ${headers} ${sources} ${header_mocs} ${form_headers} ${resources_rcc} ) SET_TARGET_PROPERTIES( RealTimeCapture PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-" ) # Set filters for project according to its namespaces FILE( RELATIVE_PATH buildDir ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) ADD_FILES_TO_FILTER( "Headers" "src/RTCF/include" "${headers}" ) ADD_FILES_TO_FILTER( "Sources" "src/RTCF/src" "${sources}" ) ADD_FILES_TO_FILTER( "Generated" "${buildDir}/src/RTCF/include" "${header_mocs}" ) ADD_FILES_TO_FILTER( "Forms" "${buildDir}/src/RTCF/include" "${form_headers}" ) ADD_FILES_TO_FILTER( "Resources" "${buildDir}" "${resources_rcc}" ) # Set additional include directories INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ) INCLUDE_DIRECTORIES( "src" ) INCLUDE_DIRECTORIES( "src/RTCF/include" ) INCLUDE_DIRECTORIES( "thirdparty" ) # Configure Qt SET( QT_USE_QTNETWORK TRUE ) SET( QT_USE_QTSQL TRUE ) SET( QT_USE_QTSCRIPT TRUE ) SET( QT_USE_QTXML TRUE ) SET( QT_USE_QTWEBKIT TRUE ) INCLUDE( ${QT_USE_FILE} ) ADD_DEFINITIONS( ${QT_DEFINITIONS} ) TARGET_LINK_LIBRARIES( RealTimeCapture ${QT_LIBRARIES} ) # Add boost support INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} ) TARGET_LINK_LIBRARIES( RealTimeCapture ${Boost_LIBRARIES} ) # Add other libs include dirs INCLUDE_DIRECTORIES( "thirdparty/SimpleCrypt" ) INCLUDE_DIRECTORIES( "thirdparty/id3lib/include" ) INCLUDE_DIRECTORIES( "thirdparty/libtwitcurl" ) INCLUDE_DIRECTORIES( "thirdparty/curl-7.24.0/curl/include" ) INCLUDE_DIRECTORIES( "thirdparty/log4qt/include" ) INCLUDE_DIRECTORIES( "thirdparty/fervor-auto" ) # Add defines ADD_DEFINITIONS( RealTimeCapture -DQUAZIP_STATIC ) ADD_DEFINITIONS( RealTimeCapture -DBUILDING_LIBCURL ) ADD_DEFINITIONS( RealTimeCapture -DID3LIB_LINKOPTION=1 ) ADD_DEFINITIONS( -DUNICODE -D_UNICODE ) #enable unicode support

更新

正如接受答案的注释中所提到的,我已经通过设置QT_QMAKE_EXECUTABLE CMake变量设置了一个自定义qmake.exe (与添加到OS PATH变量中的不同)。但问题是,qmake可执行文件具有指向所有Qt模块的硬编码路径。因此,我通过提供一个自定义的qt.conf文件(正如答案中提到的)解决了这个问题。我还没有在互联网上找到任何这样的例子,所以这里是它,也许它会对某些人有所帮助:

[Paths] Prefix=.. Documentation=doc Headers=include Libraries=lib Binaries=bin Plugins=plugins Imports=imports Data= Translations= Settings= Examples= Demos=

我用的就是这个。不过,您可以考虑在前缀中指定Qt安装的绝对路径。我只是不想在repo中使用绝对路径,因为它可以克隆到任意位置。有关使用qt.conf的详细信息,请参阅this链接。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有