如何使用CMake中的qt5_add_binary_资源生成rcc文件

如何使用CMake中的qt5_add_binary_资源生成rcc文件,qt,cmake,qml,rcc,Qt,Cmake,Qml,Rcc,我正在尝试使用qt5\u add\u binary\u资源(目标输入文件…选项…目标…)使用CMake创建rcc文件: 由于我在我的CMakeLists文件中使用了其他宏,例如add\u executable(它要求目标),我得到了以下错误: CMake Error at C:/Qt/5.5/msvc2013/lib/cmake/Qt5Core/Qt5CoreMacros.cmake:255 (add_custom_target): add_custom_target cannot crea

我正在尝试使用
qt5\u add\u binary\u资源(目标输入文件…选项…目标…)使用
CMake
创建
rcc
文件

由于我在我的
CMakeLists
文件中使用了其他宏,例如
add\u executable
(它要求
目标
),我得到了以下错误:

CMake Error at C:/Qt/5.5/msvc2013/lib/cmake/Qt5Core/Qt5CoreMacros.cmake:255 (add_custom_target):
  add_custom_target cannot create target
  "myApp" because another target with the
  same name already exists.  The existing target is an executable created in
  source directory [..]
请注意,我的
CMakeLists
文件嵌套在根
CMakeLists

编辑:我查看了
qt5\u add\u binary\u资源的(l.226)
宏。最后一行是引发我的错误的命令。它似乎什么也没做:

add_custom_目标(${target}全部取决于${rcc_destination})

我不明白为什么宏需要一个
目标

编辑:以下是我的
CMakeLists.txt
的内容,但出于清晰的原因进行了简化

CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
CMAKE_POLICY(SET CMP0002 NEW)

PROJECT(myApp)

SET(RCC_EXECUTABLE ${CMAKE_PREFIX_PATH}/bin/rcc.exe)

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

FIND_PACKAGE(Qt5Core 5.5.0 REQUIRED)
FIND_PACKAGE(Qt5Widgets 5.5.0 REQUIRED)
FIND_PACKAGE(Qt5Qml 5.5.0 REQUIRED)
FIND_PACKAGE(Qt5Quick 5.5.0 REQUIRED)

INCLUDE_DIRECTORIES(${BOOST_INCLUDE_DIRS})
# etc.

SET(myApp_LIBRARIES
    ${BOOST_THREAD_LIBRARIES}
    ${BOOSTALL_LIBRARIES}
    Qt5::Core
    Qt5::Widgets
    Qt5::Qml
    Qt5::Quick
)

SET(myApp_LIBRARIES
        ${myApp_LIBRARIES}
)

SET(myApp_SOURCES
    source/main.cpp
)

SET(myApp_RESOURCES
    resources/qml.qrc
)

SET(myApp_EXTERNAL_BINARY_RESOURCES
    themes/redTheme.qrc
    themes/blueTheme.qrc
)

ADD_EXECUTABLE(myApp WIN32
        ${myApp_SOURCES} ${myApp_RESOURCES}
)

FOREACH(_qrc_file ${myApp_EXTERNAL_BINARY_RESOURCES})
    STRING(REPLACE "qrc" "rcc" _rcc_file ${_qrc_file})
    # This is where I'd like to create my binary resources
    # QT5_ADD_BINARY_RESOURCES("test.rcc" ${_qrc_file})
    # Current working process, but not clean
    EXECUTE_PROCESS(COMMAND ${RCC_EXECUTABLE} -binary ${CMAKE_CURRENT_SOURCE_DIR}/${_qrc_file} -o ${CMAKE_CURRENT_SOURCE_DIR}/${_rcc_file})
ENDFOREACH()

根据这个文件,我试图生成两个
rcc
文件:
redTheme.rcc
blueTheme.rcc

。。。您不需要传递“OPTIONS ARGS-binary”,因为它已经被定义为二进制。 您需要传递一个目标名称,因为您可以调用“maketargetname”手动生成rcc文件。此外,如果您将rcc文件作为依赖项添加到另一个具有add_dependeny的目标,则rcc文件将由“all”目标生成。 rcc文件不会在cmake配置时生成,而是在编译时生成。如果文件发生更改,它也将重新生成


因此,您需要按照错误提示传递一个未使用的目标名称

您可以更改资源文件的目标文件名吗
qt5\u添加\u二进制\u资源(资源“qml.qrc”选项ARGS-binary)
或其他内容。在应用程序的代码中:QResource::registerResource(“resources.rcc”);不,我不能。我得到了同样的错误:另一个
目标已经存在。你能从你的CMakeList文件中提供更多的代码吗?请参阅更新的原始帖子。请注意,该文件本身嵌入在根
CMakeLists
文件中(该文件仅用于设置变量和添加子目录)。在我的例子中,用
qt5\u添加二进制资源(“redTheme”“themes/redTheme.qrc”OPTIONS ARGS-binary)替换FOREACH可以正常工作。运行cmake之后,我得到了与myApp二进制文件位于同一目录中的
redTheme.rcc
文件。
CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
CMAKE_POLICY(SET CMP0002 NEW)

PROJECT(myApp)

SET(RCC_EXECUTABLE ${CMAKE_PREFIX_PATH}/bin/rcc.exe)

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

FIND_PACKAGE(Qt5Core 5.5.0 REQUIRED)
FIND_PACKAGE(Qt5Widgets 5.5.0 REQUIRED)
FIND_PACKAGE(Qt5Qml 5.5.0 REQUIRED)
FIND_PACKAGE(Qt5Quick 5.5.0 REQUIRED)

INCLUDE_DIRECTORIES(${BOOST_INCLUDE_DIRS})
# etc.

SET(myApp_LIBRARIES
    ${BOOST_THREAD_LIBRARIES}
    ${BOOSTALL_LIBRARIES}
    Qt5::Core
    Qt5::Widgets
    Qt5::Qml
    Qt5::Quick
)

SET(myApp_LIBRARIES
        ${myApp_LIBRARIES}
)

SET(myApp_SOURCES
    source/main.cpp
)

SET(myApp_RESOURCES
    resources/qml.qrc
)

SET(myApp_EXTERNAL_BINARY_RESOURCES
    themes/redTheme.qrc
    themes/blueTheme.qrc
)

ADD_EXECUTABLE(myApp WIN32
        ${myApp_SOURCES} ${myApp_RESOURCES}
)

FOREACH(_qrc_file ${myApp_EXTERNAL_BINARY_RESOURCES})
    STRING(REPLACE "qrc" "rcc" _rcc_file ${_qrc_file})
    # This is where I'd like to create my binary resources
    # QT5_ADD_BINARY_RESOURCES("test.rcc" ${_qrc_file})
    # Current working process, but not clean
    EXECUTE_PROCESS(COMMAND ${RCC_EXECUTABLE} -binary ${CMAKE_CURRENT_SOURCE_DIR}/${_qrc_file} -o ${CMAKE_CURRENT_SOURCE_DIR}/${_rcc_file})
ENDFOREACH()