首先,让我们看一下我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)
,所以这里有几件事。它归结为宏CMake
及其逻辑。
双-DQT_DLL
来自add_definitions(${QT_DEFINITIONS)})
。指定include(${QT_USE_FILE})
就足够了。
QT_USE_FILE
根据当前CMAKE_BUILD_TYPE
定义QT_DEBUG
(或QT_NO_DEBUG
(。如果出于某种原因您不想在DEBUG
模式下QT_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()
现在,您可以尝试调整这些设置...