CMake + Qt =刻在石头Qt定义(又名.-DQT _...)?

Ale*_*aev 6 qt cmake built-in definitions

首先,让我们看一下我的摘录CMakeLists.txt:

find_package(Qt4 4.8.0 COMPONENTS QtCore QtGui QtOpenGL REQUIRED)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})
Run Code Online (Sandbox Code Playgroud)

因此,默认情况下,我们在调试模式下获得以下定义:

-DQT_DLL -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_DLL -DQT_DEBUG
Run Code Online (Sandbox Code Playgroud)

所以第一个问题是:为什么有两个-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)
Run Code Online (Sandbox Code Playgroud)

Ano*_*ous 2

好的,我们有几件事。它归结为CMake宏及其逻辑。

-DQT_DLL来自add_definitions(${QT_DEFINITIONS)}). 指定就足够了include(${QT_USE_FILE})

QT_USE_FILE基于当前定义QT_DEBUG(或) 。如果出于某种原因您不想处于该模式(并且不想使用),可能有一种方法可以做到这一点。将这些具体定义放在目录属性中:QT_NO_DEBUGCMAKE_BUILD_TYPEQT_DEBUGDEBUGQT_USE_FILECMake

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()
Run Code Online (Sandbox Code Playgroud)

现在,您可以尝试调整这些设置......