CMake生成的源代码未编译

时间:2015-06-11 18:03:51

标签: qt cmake

我添加了代码,使用QT的MOC可执行文件生成文件。当我尝试构建它时,会生成文件,但它不会被编译。

find_program (QT_UIC uic)
find_program (QT_MOC moc)

set(TARGET_LIBRARY support_qt_${UNICODE_FLAG}${STATIC_FLAG}${BUILD_TYPE_FLAG})

# Enable the build directory as an include path as well, required for
# qt moc generated files.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)

include_directories(${Qt5Widgets_INCLUDES})
include_directories("..")

set(SUPPORT_SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/support_qt_dll_api.h
    ${CMAKE_CURRENT_SOURCE_DIR}/supportlib_qt_namespace.h
    ${CMAKE_CURRENT_SOURCE_DIR}/dll_main.cpp
)

if (STATIC_BUILD)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILD_SUPPORT_QT_STATIC")
else (NOT STATIC_BUILD)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILD_SUPPORT_QT_DLL")
endif()

if (UNICODE_BUILD)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNICODE")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic -Wextra")

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")

add_subdirectory (logging)
add_subdirectory (models)
add_subdirectory (window)

#QT5_WRAP_UI(QT_UI_HEADERS ${QT_UI_SOURCES} )

# Process each .ui file and create a dependency to the
# the corresponding .h file.
set(GENERATED_SOURCES "")
foreach(ui_file ${SUPPORT_SOURCE})
    get_filename_component(ui_ext ${ui_file} EXT)
    string(TOLOWER ${ui_ext} ui_ext)

    set(ui_dependency "")
    string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" ui_gen_file ${ui_file})
    if( ${ui_ext} STREQUAL ".ui" )
        string(REGEX REPLACE ".ui$" ".h" ui_gen_file "${ui_gen_file}")
        add_custom_command(
            #PRE_BUILD
            OUTPUT "${ui_gen_file}"
            COMMAND ${QT_UIC} -g cpp -o "${ui_gen_file}" "${ui_file}"
            MAIN_DEPENDENCY "${ui_file}"
            COMMENT "Generating UI: ${ui_gen_file}"
        )

        # A .ui File always has a .moc file with it.
        string(REGEX REPLACE ".h$" ".moc" ui_gen_file "${ui_gen_file}")
        set(ui_ext ".moc")
    endif()

    if( ${ui_ext} STREQUAL ".moc" )
        string(REGEX REPLACE ".moc$" ".cpp" ui_gen_file "${ui_gen_file}")
        set(GENERATED_SOURCES "${GENERATED_SOURCES} ${ui_gen_file}")
        add_custom_command(
            #PRE_BUILD
            OUTPUT "${ui_gen_file}"
            COMMAND ${QT_MOC} -o "${ui_gen_file}" -f "${ui_file}" "${ui_file}"
            MAIN_DEPENDENCY "${ui_file}"
            COMMENT "Generating MOC: ${ui_gen_file}"
        )

        set(GENERATED_SOURCE "${GENERATED_SOURCE} ${ui_gen_file}")
        #message("Generated: ${ui_gen_file}")
    endif()

endforeach()

set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED TRUE)
add_library(${TARGET_LIBRARY} ${BUILD_TYPE} ${SUPPORT_SOURCE} ${GENERATED_SOURCES})
target_link_libraries(${TARGET_LIBRARY} Qt5::Widgets)

set_target_properties(${TARGET_LIBRARY} PROPERTIES
                      RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
                      ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
                      LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
)

当我从${GENERATED_SOURCES}删除append_library时,我收到此错误:

CMake Error at support_qt/CMakeLists.txt:109 (add_library):
  Cannot find source file:

     D:/src/c/support_lib/build/support_qt/logging/logging_dialog_box_gui.cpp D:/src/c/support_lib/b
uild/support_qt/logging/logging_dialog_box_gui.cpp

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

CMake Error: CMake can not determine linker language for target: support_qt_ad
CMake Error: Cannot determine link language for target "support_qt_ad".

我看过其他帖子,其中使用add_custom_command显示了类似的脚本,但当我这样做时,我得到:

mingw32-make[2]: *** No rule to make target 'support_qt/ D:/src/c/support_lib/build/support_qt/loggi
ng/logging_dialog_box_gui.cpp D:/src/c/support_lib/build/support_qt/logging/logging_dialog_box_gui.c
pp', needed by 'support_qt/CMakeFiles/support_qt_ad.dir/_D_/src/c/support_lib/build/support_qt/loggi
ng/logging_dialog_box_gui.cpp_D_/src/c/support_lib/build/support_qt/logging/logging_dialog_box_gui.c
pp.obj'.  Stop.
CMakeFiles\Makefile2:236: recipe for target 'support_qt/CMakeFiles/support_qt_ad.dir/all' failed
mingw32-make[1]: *** [support_qt/CMakeFiles/support_qt_ad.dir/all] Error 2
makefile:74: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

并且文件不会仅生成。

更新

我也试过set(CMAKE_AUTOMOC ON)并且生成的cpp被编译,但只编译一次。修改moc或包含ui文件时,它不会更新它。看一个完全有效的例子会很有帮助。当我谷歌我只找到片段。 :(

1 个答案:

答案 0 :(得分:1)

设置:SET(CMAKE_AUTOMOC ON)足以指示CMake在需要时自动运行moc(需要CMake 2.8.6+)。 不要忘记从${GENERATED_SOURCES}删除append_library

还要添加QT5_WRAP_UI宏,例如:

FILE (GLOB_RECURSE project_UIS *.ui)
QT5_WRAP_UI(project_FORM_HDR ${project_UIS})

ADD_LIBRARY(${project_LIB} ${project_SRCS} ${project_FORM_HDR})

编辑:完整的工作示例。为简单起见,省略了一些与Qt无关的内容。

LIST (APPEND CMAKE_PREFIX_PATH "/opt/Qt5.4.1/5.4/gcc_64")

# Instruct CMake to run moc automatically when needed.
SET(CMAKE_AUTOMOC ON)
# Find includes in corresponding build directories
SET(CMAKE_INCLUDE_CURRENT_DIR ON)

# Widgets finds its own dependencies (QtGui and QtCore).
FIND_PACKAGE(Qt5Widgets REQUIRED)

FILE (GLOB_RECURSE project_SRCS *.cpp *.cxx *.cc *.C *.c *.h *.hpp)
SET (project_LIBS Qt5::Widgets)
SET (project_BIN ${APP_NAME})

FILE (GLOB_RECURSE project_UIS *.ui)
QT5_WRAP_UI(project_FORM_HDR ${project_UIS})

ADD_EXECUTABLE(${project_BIN} ${project_SRCS} ${project_FORM_HDR})
TARGET_LINK_LIBRARIES(${project_BIN} ${project_LIBS})
相关问题