【问题标题】:Invoke MIDL compiler from CMAKE从 CMAKE 调用 MIDL 编译器
【发布时间】:2018-04-03 09:13:48
【问题描述】:

我打算将 MIDL 编译器与 CMAKE 一起使用,但无法从 CmakeList 调用 MIDL 编译器

这是我用来实现目标的命令

add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/IFace.h ${CMAKE_CURRENT_BINARY_DIR}/GUIDS.c ${CMAKE_CURRENT_BINARY_DIR}/Proxy.c ${CMAKE_CURRENT_BINARY_DIR}/ProxyDll.c
COMMAND midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${CMAKE_CURRENT_LIST_DIR}/include/Server.idl
)

当我构建我的项目时,${CMAKE_CURRENT_BINARY_DIR} 中没有 MIDL 编译器生成的文件

但是用这个签名文件生成得很好

add_custom_command(
PRE_BUILD
TARGET ${PROJECT_NAME}
COMMAND midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${CMAKE_CURRENT_LIST_DIR}/include/Server.idl
)

我做错了什么?

【问题讨论】:

  • 就其本身而言,add_custom_command 是行不通的;您需要将其 OUTPUT 作为某些 add_custom_target 调用的 DEPENDS 部分。 add_custom_command(PRE_BUILD) 是命令的一种特殊形式,它会自动附加到它的 TARGET
  • @Tsyvarev 谢谢,我不知道它是如何工作的。

标签: c++ cmake midl


【解决方案1】:

这就是它的工作原理:

set(MIDL_OUTPUT
    ${CMAKE_CURRENT_BINARY_DIR}/IFace.h
    ${CMAKE_CURRENT_BINARY_DIR}/GUIDS.c
    ${CMAKE_CURRENT_BINARY_DIR}/Proxy.c
    ${CMAKE_CURRENT_BINARY_DIR}/ProxyDll.c
    )
set(MIDL_FILE
    ${CMAKE_CURRENT_LIST_DIR}/include/Server.idl
    )
add_custom_command(
    OUTPUT ${MIDL_OUTPUT}
    COMMAND midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${MIDL_FILE}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    DEPENDS ${MIDL_FILE}
    VERBATIM
    )
add_custom_target(midl-cmplr
    DEPENDS ${MIDL_OUTPUT}
    )
add_dependencies(${PROJECT_NAME}
    midl-cmplr
    )
set_source_files_properties(
    ${MIDL_OUTPUT}
        PROPERTIES
            GENERATED TRUE
            )

【讨论】:

  • add_custom_targetadd_dependencies 可能没有必要,只要将${MIDL_OUTPUT} 添加到您的源文件列表即可。另见:cmake.org/pipermail/cmake/2007-June/014802.html
  • 我发现如果我不将 MAIN_DEPENDENCY ${MIDL_FILE} 添加到 add_custom_command 中,它不会显示在 idl 文件的属性下,并且当您在该文件上点击编译时也不会编译
【解决方案2】:

要改进@definename 的答案和@nathan-moinvaziri 的评论,只要将输出添加到源文件列表中,就不必执行add_custom_target,因此修改后的答案是:

set(MIDL_OUTPUT
    ${CMAKE_CURRENT_BINARY_DIR}/IFace.h
    ${CMAKE_CURRENT_BINARY_DIR}/GUIDS.c
    ${CMAKE_CURRENT_BINARY_DIR}/Proxy.c
    ${CMAKE_CURRENT_BINARY_DIR}/ProxyDll.c
)
set(MIDL_FILE
    ${CMAKE_CURRENT_LIST_DIR}/BookSku.idl
)
add_custom_command(
    OUTPUT ${MIDL_OUTPUT}
    COMMAND midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${MIDL_FILE}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    DEPENDS ${MIDL_FILE}
    MAIN_DEPENDENCY ${MIDL_FILE}
    VERBATIM
)
# add_custom_target(midl-cmplr
#     DEPENDS ${MIDL_OUTPUT}
# )
# add_dependencies(${PROJECT_NAME}
#     midl-cmplr
# )
# set_source_files_properties(${MIDL_OUTPUT} PROPERTIES
#   GENERATED TRUE
# )
target_sources(${PROJECT_NAME} PRIVATE ${MIDL_FILE} ${MIDL_OUTPUT})

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 2014-05-19
    • 2012-02-02
    • 2023-03-03
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多