Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用CMake包含特定的Qt安装?_Qt_Cmake - Fatal编程技术网

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

如何使用CMake包含特定的Qt安装?,qt,cmake,Qt,Cmake,我们在每个开发人员的PC上都有大量的Qt副本-每个项目在第三方目录中都有自己的Qt副本。这是因为每个项目都是用自己的Qt开发和测试的;一种常见的情况是,我们需要为某些项目定制Qt构建。因此,由于上面提到的原因,我们有一个单独的SVN repo用于保存各种Qt构建,每个Qt项目中都有一个外部的SVN repo,它指的是这些构建中的一个 问题是,当使用CMake时,我们只能选择Qt的一个版本,而Qt4查找器自己决定使用什么Qt。这不是正确的。我们需要重定向finder,以便为项目的第三方目录中的特定

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

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

我试图为
FIND_-PACKAGE
指定
path
选项,就像这样:
FIND_-PACKAGE(Qt4所需路径“thirdparty/Qt”)
。我试图设置
QT\u QMAKE\u EXECUTABLE
变量,但没有成功。我尝试在安装之前将所需的QMake路径(FindQt4.cmake使用它来确定所有目录)添加到path变量中,但这也没有帮助

有没有一种方法可以使用FIND_包提供的所有东西,但用于某个Qt拷贝?我真的不想实现所有的Qt包装器,手动设置所有的定义、include、dir等等

这是我的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\u qmake\u EXECUTABLE
CMake变量,成功地设置了一个自定义qmake.exe(不同于添加到OS PATH变量中的qmake.exe)。但问题是,qmake可执行文件具有指向所有Qt模块的硬编码路径。因此,我通过提供一个定制的
qt.conf
文件(如答案中所述)解决了这个问题。我在互联网上没有找到任何这样的例子,所以在这里,也许它会帮助一些人:

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

我用的正是这个。不过,您可以考虑在前缀中指定Qt安装的绝对路径。我只是不想在回购协议中使用绝对路径,它可以在任意位置克隆。请参阅有关使用
qt.conf
的详细信息的链接。使用
qt\u QMAKE\u可执行文件
,您已经走上了正确的道路。该变量是缓存变量,因此简单地设置它将不起作用。。。除非您通过GUI,或在第一次运行cmake之前,或在CMakeCache.txt中,或使用“缓存”和“强制”选项设置
,否则缓存的值将保持不变

这是我使用的习惯用法,因为我有固定的逻辑根据配置时已知的变量选择我的QT目录。在这里,我在运行FIND_包之前设置了变量,因此没有缓存问题

IF(WIN32 AND ${CMAKE_SIZEOF_VOID_P} MATCHES 8)
  # Hardcode a location for a QT toolkit compiled for Win64.  By overriding QT_QMAKE, all the rest is found
  # Choose any version of QT found in the 64-bit tools area
  FILE(GLOB QTROOTS c:/Tools_x64/Qt/*/bin)     # */
  FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake4 qmake-qt4 qmake-mac PATHS ${QTROOTS})
ENDIF()
将此放在FIND_包(Qt4)之前

根据评论中的新信息进行编辑:

哦,我现在和你在一起。你有多少损坏的Qt安装。FindQt模块将始终使用qmake可执行文件来发现Qt树的设置。Qmake将此信息存储在一组“持久属性”中,可以使用
Qmake-query
查询,也可以使用
Qmake-set
进行设置。因此,您可以通过运行qtake并设置Qt_INSTALL_PREFIX属性来“修复”Qt安装,如下所述:

或者,在旧的SO问题中,未接受的答案使用qt.conf覆盖qt前缀


这两种解决方案都涉及修改Qt安装。我不确定有什么办法可以解决这个问题,但如何将其融入您的存储库和构建系统超出了此处的范围。

如果可以,我想完成/确认此处所述的一些信息,并给出一个完整的示例

像掩星一样,我有一个定制的Qt环境,我必须在我的项目中使用它。以下是我复制的使项目编译的步骤:

  • 我的项目的CMakeLists.txt已经拥有了所有的CMake内容,只包含了一个“qt.CMake”文件

    include(qt)
    
  • qt.cmake文件包含Peter的解决方案,并用附加内容进行了修饰。通过这种配置,我可以使用moc、uic和rcc来管理UI文件、资源文件等。这是我的文件和一些注释。如果它们不是严格正确的,请毫不犹豫地修复它们(CMake的工作方式对我来说仍然很模糊):

  • 我还添加了掩星的qt.conf文件,其级别与qmake可执行文件相同

  • 完成这三个步骤后,一切都很顺利。希望这个完整的例子能帮助别人


    谢谢你们,你们显然帮了我的忙

    这就是我的工作原理:

    set( QT_ROOT /opt/myqt/ )
    set( ENV(CMAKE_PREFIX_PATH) ${QT_ROOT} )
    FIND_PACKAGE( Qt4 COMPONENTS QtCore QtGui QtDBUS REQUIRED )
    

    这将改变PATH环境变量,但我还没有找到其他方法。其他答案对我不起作用。

    “PATHS”--拼写正确的不是“PATHS”吗?这就是为什么CMake的find_package命令完全是垃圾。每个FindXXX.cmake模块只是一些不一致的混乱,与任何其他find模块几乎没有相似性。这破坏了CMake的实用性。要成为一致的查找模块,只需使您的模块完全不一致即可保持与其他模块的一致性。问题是,所有Qt副本都是在不同的计算机上构建和使用的。qmake顽固地继续返回生成机器的路径,但不返回当前位置。我怎么办?这就是我刚才给出的答案。如果无法以任何方式自动选择,则在填充缓存之前以及在运行FIND_包(Qt4)之前手动执行QT_QMAKE_可执行文件。您还没有得到它。。众所周知,qmake.exe已经为它构建的机器构建了路径。FindQt4.cmake使用qmake.exe确定Qt的安装路径。它只返回不正确的!它们指的是生成它的计算机上的路径,但不能保证它将在另一台开发人员PC上的同一路径中签出。我可以指定qmake executable,但由于这些断开的路径,我什么也看不到。似乎有一个解决办法
    # The path where Qt is.
    SET(QT_ROOT_DIR "path/to/qt")
    
    set(QT_QMAKE_EXECUTABLE ${QT_ROOT_DIR}/osx/bin/qmake)
    
    # Loads CMake macros bound to Qt.
    find_package(Qt4 REQUIRED)
    # Includes used Qt headers.
    include(${QT_USE_FILE})
    
    set( QT_ROOT /opt/myqt/ )
    set( ENV(CMAKE_PREFIX_PATH) ${QT_ROOT} )
    FIND_PACKAGE( Qt4 COMPONENTS QtCore QtGui QtDBUS REQUIRED )