2012-01-29 49 views
6

首先,讓我們看一下摘自我CMakeLists.txtCMake + Qt =刻在石頭上Qt的定義(aka。-DQT _...)?

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) 

回答

2

好了,所以我們在這裏有幾件事情。它歸結爲CMake宏及其邏輯。

-DQT_DLL來自add_definitions(${QT_DEFINITIONS)})。 指定include(${QT_USE_FILE})就足夠了。

QT_USE_FILE定義QT_DEBUG(或QT_NO_DEBUG)基於目前的CMAKE_BUILD_TYPE。如果由於某種原因,您不想在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() 

現在,你可以嘗試調整這些設置...