2012-01-29 29 views
6

Đầu tiên, chúng ta hãy nhìn vào những đoạn trích từ CMakeLists.txt tôi:CMake + Qt = được khắc trong các định nghĩa Qt bằng đá (aka. -DQT _...)?

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

Vì vậy, theo mặc định chúng tôi nhận được định nghĩa sau đây trong chế độ Debug:

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

Vì vậy, câu hỏi đầu tiên là: tại sao có hai -DQT_DLL định nghĩa?

Bây giờ, nếu tôi nối thêm, ví dụ: remove_definitions(-DQT_DEBUG) - không có gì thay đổi. Nói cách khác, lệnh remove_definitions bị lỗi hoặc các định nghĩa này chỉ được khắc trên đá.

Sau đó, tôi nghĩ rằng "OK, có thể remove_definitions lệnh thực sự bị lỗi, hãy thực hiện theo cách khác." Và tôi đã làm list(REMOVE_ITEM QT_DEFINITIONS -DQT_DEBUG). Tuy nhiên, nó cũng không hoạt động.

Do đó, câu hỏi thứ hai là: các định nghĩa này có thực sự được tích hợp và liên tục và không thể thay đổi trong bất kỳ trường hợp nào không?

LƯU Ý: Mặc dù vấn đề với cách chỉnh sửa các định nghĩa được xây dựng-in, nó vẫn còn có thể thêm các định nghĩa tùy chỉnh, ví dụ:

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

Trả lời

2

Ok, vì vậy ở đây chúng tôi có một vài điều. Nó tóm tắt các macro CMake và logic của chúng.

Double -DQT_DLL đến từ add_definitions(${QT_DEFINITIONS)}). Đủ để chỉ định include(${QT_USE_FILE}).

QT_USE_FILE xác định QT_DEBUG (hoặc QT_NO_DEBUG) dựa trên CMAKE_BUILD_TYPE hiện tại. Nếu vì lý do nào đó bạn không muốn có QT_DEBUG ở chế độ DEBUG (và để hoạt động với QT_USE_FILE), có thể có cách để thực hiện điều đó. CMake đặt những định nghĩa cụ thể trong các thuộc tính thư mục:

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() 

Bây giờ, bạn có thể thử tinh chỉnh các thiết lập này ...