我们在每台开发PC上都有大量的Qt拷贝 - 每个项目在第三方目录中都有自己的Qt拷贝.这是因为每个项目都是用自己的Qt开发和测试的; 一个常见的情况是,我们需要为某个项目定制Qt版本.因此,由于上面提到,我们有一个单独的SVN repo,用于在每个Qt项目中保存各种Qt构建和外部,它们指的是这些构建中的一个.
问题是,当使用CMake时,我们只能选择Qt的版本,而Qt4 finder决定自己使用什么Qt.那不是正确的.我们需要重定向finder以配置项目第三方目录中特定Qt副本的所有内容.
我试图指定类似的PATHS选项FIND_PACKAGE:FIND_PACKAGE( Qt4 REQUIRED PATHS "thirdparty/Qt" )但这没有帮助.我试图设置QT_QMAKE_EXECUTABLE变量,但这不起作用.我已经尝试在安装之前将PATM变量所需的QMake路径(它由FindQt4.cmake用来确定所有目录)添加到PATH变量中,但这也没有帮助.
有没有办法使用FIND_PACKAGE提供的所有东西但是对于某个Qt拷贝?我真的不想实现所有Qt包装器,手动设置所有定义,包括,dirs等.
这是我的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
Run Code Online (Sandbox Code Playgroud)
UPDATE
正如在接受的答案的评论中提到的那样,我设法通过设置QT_QMAKE_EXECUTABLECMake变量来设置自定义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=
Run Code Online (Sandbox Code Playgroud)
我用的就是这个.您可以考虑在前缀中指定Qt安装的绝对路径.我只是不想在回购中使用绝对路径,可以将其克隆到任意位置.请参见本使用有关的详细信息的链接qt.conf.
Pet*_*ter 10
你正走在正确的轨道上QT_QMAKE_EXECUTABLE.该变量是一个缓存变量,所以简单地设置它将不起作用...除非你通过GUI更改它,或者在第一次运行cmake之前,或者在CMakeCache.txt中,或者使用CACHE,否则缓存的值将会存在...和FORCE选项SET.
这是我使用的习惯用法,因为我有固定的逻辑来根据配置时已知的变量选择我的QT目录.在这里,我在运行FIND_PACKAGE之前设置变量,因此没有缓存问题.
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()
Run Code Online (Sandbox Code Playgroud)
把它放在FIND_PACKAGE(Qt4)之前
根据评论中的新信息进行编辑:
哦,我现在和你在一起.你有多少钱破坏Qt安装.FindQt模块将始终使用qmake可执行文件来发现Qt树的设置.Qmake将此信息存储在一组"持久属性"中,可以使用这些属性进行查询qmake -query和设置qmake -set.因此,您可以通过运行qmake并设置QT_INSTALL_PREFIX属性来"修复"Qt安装,如下所述:http://doc.qt.digia.com/4.7-snapshot/qmake-environment-reference.html
qmake -set "QT_INSTALL_PREFIX" /path/to/qt/
Run Code Online (Sandbox Code Playgroud)
或者,在旧的SO问题qmake和QT_INSTALL_PREFIX中.如何为Qt库选择新位置?,一个未被接受的答案使用qt.conf来覆盖QT前缀.
这两种解决方案都涉及修改Qt安装.我不确定是否有任何解决方法,但这适合您的存储库和构建系统在这里超出了范围.
| 归档时间: |
|
| 查看次数: |
26111 次 |
| 最近记录: |