qmake - QMake / jom 强制额外的 MIDL 编译器在 RC 之前运行
问题描述
我正在将一个旧的 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:在 RC.exe 需要它并且构建失败时,Button.tlb 还不存在。
有没有办法强制 jom 在开始 rc 之前等待 midl 完成?
我在 MSVC2013 下使用 QT 5.3.1。
解决方案
QMake 只不过是一个 makefile 生成器。您的问题是由于进行(或 jom)并行作业执行。res/obj
要解决此问题,您只需在文件和文件之间的 Makefile 中引入单个依赖项(没有任何配方)tlb
。这可以通过以下方式完成:
dep_restlb.target = $(RES_FILE)
dep_restlb.depends = $${DESTDIR}/Button.tlb # QMAKE_FILE_BASE is not available here
QMAKE_EXTRA_TARGETS += dep_restlb
推荐阅读
- powerapps - 如何将参数从 Power Apps 发送到 Power Automate Flow
- web-services - 从 Basic/TB WebBrowser 通过基本 HTML 版本网站访问 WebMail(即:“Mail.com”)电子邮件
- django-models - GeoDjango / GDAL:存储了错误的数据字段
- r - 使用 R 自定义 ggplot 图例
- windows - 有没有办法在电子窗口应用程序中获取联系人列表
- django - 创建第一个数据库后,我无法使用 django 在 postgres 中创建另一个数据库
- python - 是否可以复制列表分配?
- java - 如何将android应用程序连接到localhost?
- python - Python - 如何使用 selenium 从消失的下拉列表中查找元素
- uwp - 我们可以在 uwp 运行时更改应用程序图标吗?