Подтвердить что ты не робот

Как включить определенную установку Qt с помощью CMake?

У нас есть много Qt-копий на каждом dev-компьютере - каждый проект имеет свою собственную Qt-копию в каталоге thirdparties. Это сделано из-за каждого проекта, разрабатывается и тестируется с помощью собственного Qt; часто случаем является то, что нам нужна специальная сборка Qt для некоторого проекта. Поэтому из-за упомянутого выше мы имеем отдельное репо SVN для проведения различных построений Qt и внешнего в каждом проекте Qt, который относится к одному из этих сборок.

Проблема в том, что при использовании CMake мы можем выбрать только версию Qt, а Qt4 finder решает, что Qt использовать сам по себе. И это не правильно. Нам нужно перенаправить поисковик, чтобы настроить все материалы для конкретной копии Qt в каталоге сторонних разработчиков.

Я попытался указать параметр PATHS для FIND_PACKAGE следующим образом: FIND_PACKAGE( Qt4 REQUIRED PATHS "thirdparty/Qt" ), но это не помогло. Я попытался установить переменную QT_QMAKE_EXECUTABLE, но это не сработало. Я попытался добавить требуемый путь 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

UPDATE

Как уже упоминалось в комментариях к принятому ответу, мне удалось установить пользовательский qmake.exe(отличный от того, который был добавлен в переменную ОС PATH), установив переменную QT_QMAKE_EXECUTABLE CMake. Но проблема в том, что исполняемый файл 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.

4b9b3361

Ответ 1

Вы на правильном пути с QT_QMAKE_EXECUTABLE. Эта переменная является переменной кэша, поэтому просто ее установка не будет работать... кешированное значение будет зависеть, если вы не измените его с помощью графического интерфейса пользователя, или перед запуском 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()

Поместите это перед FIND_PACKAGE (Qt4)

РЕДАКТИРОВАНИЕ на основе новой информации в комментариях:

О, я сейчас с тобой. У вас есть какая-то сумма для сломанных установок Qt. Модуль FindQt всегда будет использовать исполняемый файл qmake для обнаружения настроек для дерева Qt. Qmake хранит эту информацию в наборе "постоянных свойств", который можно запросить с помощью qmake -query и установить с помощью qmake -set. Таким образом, вы можете "исправить" установку Qt, запустив ее qmake и установив свойство QT_INSTALL_PREFIX, как описано здесь: http://doc.qt.digia.com/4.7-snapshot/qmake-environment-reference.html

qmake -set "QT_INSTALL_PREFIX" /path/to/qt/

Или, в старом вопросе SO qmake и QT_INSTALL_PREFIX. Как я могу выбрать новое место для библиотеки Qt?, непринятый ответ использует qt.conf для переопределения префикса QT.

Оба этих решения включают модификацию установки Qt. Я не уверен, что это возможно, но как это вписывается в вашу систему репозитория и сборки, здесь нет области.

Ответ 2

Если возможно, я хотел бы заполнить/подтвердить указанную здесь информацию и дать полный пример.

Как и Occulta, у меня есть настраиваемая среда Qt, которую я должен использовать для своего проекта. Это шаг, который я воспроизвел для компиляции проекта:

  • Файл CMakeLists.txt моего проекта, уже обладающий всем материалом CMake, просто включает файл "qt.cmake"

    include(qt)
    
  • Файл qt.cmake содержит решение Peter, украшенное дополнительным материалом. С этой конфигурацией я могу использовать moc, uic и rcc для управления файлами UI, файлами ресурсов и т.д. Здесь мой файл с некоторыми комментариями. Не стесняйтесь исправить их, если они не являются строго правильными (способ работы CMake по-прежнему облачно для меня):

    # 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})
    
  • Я также добавил файл qt.conf оккультата на том же уровне, что и исполняемый файл qmake.

Все прошло отлично, как только эти три шага были сделаны. Надеюсь, что этот полный пример поможет кому-то.

Спасибо, ребята, вы явно помогли мне здесь!

Ответ 3

Это то, что сработало для меня:

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

Это изменит переменную среды PATH, но я не нашел другого способа. Другие ответы не помогли мне.