【问题标题】:QMake / jom force extra MIDL compiler to run before RCQMake / jom 强制额外的 MIDL 编译器在 RC 之前运行
【发布时间】:2019-08-14 07:51:25
【问题描述】:

我正在将一个旧的 OCX 项目转换为 QMake(因为它在我的公司中获得了“新”标准)。 在我的 Button.pro 文件中,我通过以下方式添加 MIDL 编译器

idl_c.output = $${DESTDIR}/${QMAKE_FILE_BASE}.tlb
idl_c.input = IDL
idl_c.commands = $${QMAKE_IDL} ${QMAKE_FILE_IN} $${IDLFLAGS} \
                 /tlb ${QMAKE_FILE_OUT}
idl_c.variable_out = GENERATED_FILES
idl_c.CONFIG += target_predeps
idl_c.name = MIDL

QMAKE_EXTRA_COMPILERS += idl_c

IDL += $$PWD/Button.odl

.pro 文件还提到我有一个 RC 文件

RC_FILE += $$PWD/Button.rc

此 RC 文件包含此 tlb 文件的 TYPELIB,这意味着它必须在 rc.exe 运行之前可用

1 TYPELIB "Button.tlb"

然后我通过 QMake 生成一个 makefile 并使用 nmake 构建我的项目。一切运行正常:控制台没有显示错误,并且生成了输出 OCX(并且可以正常工作)。我可以清楚地看到 MIDL 首先执行,RC,然后是其余的。 如果我尝试使用 jom 构建,订单将不再满足。 jom 似乎尝试并行执行 MIDL 和 RC:Button.tlb 在 RC.exe 需要它时还不存在,并且构建失败。

有没有办法强制 jom 在启动 rc 之前等待 midl 完成?

我在 MSVC2013 下使用 QT 5.3.1。

【问题讨论】:

    标签: qmake rc midl parallel-builds


    【解决方案1】:

    QMake 只不过是一个 makefile 生成器。您的问题是由于进行(或 jom)并行作业执行。要解决此问题,您只需在 res/objtlb 文件之间的 Makefile 中引入单个依赖项(没有任何配方)。这可以通过以下方式完成:

    dep_restlb.target = $(RES_FILE)
    dep_restlb.depends = $${DESTDIR}/Button.tlb # QMAKE_FILE_BASE is not available here
    QMAKE_EXTRA_TARGETS += dep_restlb
    

    【讨论】:

    • 我必须承认我没想到它会这么简单... ${RES_FIL} 不存在,所以我不得不用以下方式修改它:``` dep_restlb.target = $$OBJECTS_DIR\Button.res dep_restlb.depends = $${DESTDIR}/Button.tlb QMAKE_EXTRA_TARGETS += dep_restlb ``` ...它成功了!感谢您的帮助!
    • @NonoxX ${RES_FILE} 将在 Makefile 中定义。因此,一美元。
    • 肯定不是 ``` 错误:在 E:\Projects\Button\Makefile 第 463 行中找到无效的宏调用 ``
    • @NonoxX 奇怪,我确信它也是为 nmake 定义的。好的,那么它只针对 gcc 生成器。
    • 我想我发现:${RES_FILE} 不存在。 $(RES_FILE) 确实 :) 仍然必须在 distclean 中删除它,因为当时它不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多