CMake + Qt = высеченные в камне определения Qt (он же. -DQT _...)? - PullRequest
6 голосов
/ 29 января 2012

Во-первых, давайте посмотрим на отрывок из моего CMakeLists.txt:

find_package(Qt4 4.8.0 COMPONENTS QtCore QtGui QtOpenGL REQUIRED)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})

Следовательно, по умолчанию мы получаем следующие определения в режиме отладки:

-DQT_DLL -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_DLL -DQT_DEBUG

Итак, первый вопрос: почему существует два -DQT_DLL определения?

Теперь, если я добавлю, например, remove_definitions(-DQT_DEBUG) - ничего не изменится. Другими словами, либо команда remove_definitions содержит ошибки, либо эти определения просто высечены на камне.

Тогда я подумал: «Хорошо, может быть, remove_definitions команда действительно содержит ошибки, давайте сделаем это по-другому». И я сделал list(REMOVE_ITEM QT_DEFINITIONS -DQT_DEBUG). Однако это тоже не сработало.

Следовательно, второй вопрос: действительно ли эти определения являются встроенными и постоянными и не могут быть изменены ни при каких обстоятельствах?

ПРИМЕЧАНИЕ: Несмотря на проблемы с редактированием этих встроенных определений, все еще возможно добавить пользовательские определения, например:

add_definitions(-DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT)

1 Ответ

2 голосов
/ 04 апреля 2012

Хорошо, у нас есть несколько вещей. Это сводится к макросам CMake и их логике.

Double -DQT_DLL происходит от add_definitions(${QT_DEFINITIONS)}). Достаточно указать include(${QT_USE_FILE}).

QT_USE_FILE определяет QT_DEBUG (или QT_NO_DEBUG) на основе текущего CMAKE_BUILD_TYPE. Если по какой-либо причине вы не хотите иметь QT_DEBUG в режиме DEBUG (и работать с QT_USE_FILE), может быть способ сделать это. CMake помещает эти конкретные определения в свойства каталога:

SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG QT_DEBUG)
SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE QT_NO_DEBUG)
SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO QT_NO_DEBUG)
SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL QT_NO_DEBUG)
IF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS QT_NO_DEBUG)
ENDIF()

Теперь вы можете попробовать настроить эти параметры ...

...