我在 Windows 上使用 cmake 2.8.11,在 Qt 项目中为 mingw-w64 生成 makefile。我想使用预编译的头文件。为此,我需要重新创建编译器的参数。最后,我坚持使用硬编码的自定义命令:
foreach(dir ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS})
set(MY_INCLUDE_ARGS "${MY_INCLUDE_ARGS}" "-I${dir}")
endforeach()
add_custom_command(
PRE_BUILD
OUTPUT all.h.gch
COMMAND
${CMAKE_CXX_COMPILER} -x c++-header -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -std=c++11 -g
-c "${CMAKE_CURRENT_SOURCE_DIR}/all_real.h" -o "${CMAKE_CURRENT_SOURCE_DIR}/all.h.gch"
${MY_INCLUDE_ARGS}
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/all_real.h"
IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/all_real.h"
COMMENT "Generating precompiled headers"
)
它有点工作,但我应该能够使用一些变量来填充所有这些 -D,我不应该需要 for 循环或明确列出 Qt 模块。
我试图读取目标和目录属性,但它们是空的!
find_package(Qt5Core)
find_package(Qt5Gui)
find_package(Qt5Widgets)
...
add_executable(app ${CPP_FILES} ${H_FILES} ${UI_FILES})
target_link_libraries(app Qt5::Core Qt5::Gui Qt5::Widgets)
qt5_wrap_ui(ui_main_window.h main_window.ui)
qt5_add_resources(app ${QRC_FILES})
GET_PROPERTY(dat1 DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
get_target_property(dat2 app INCLUDE_DIRECTORIES)
MESSAGE(STATUS "!!!! ${dat1}") # Empty!
MESSAGE(STATUS "!!!! ${dat2}") # Empty!
此外 CMAKE_CXX_FLAGS 仅包含我自己通过 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -H") 放在那里的内容,并且我不能在 add_custom_command 中真正使用它,因为它与引号一起扩展。
请帮忙。