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 содержит TYPELIB для этого файла tlb, что означает, что он должен быть доступен до запуска rc.exe

1 TYPELIB "Button.tlb"

Затем я создаю make-файл с помощью QMake и создаю свой проект с помощью nmake. Все работает нормально: консоль не показывает ошибок, а выходной OCX генерируется (и работает). Я ясно вижу, что сначала выполняется MIDL, потом RC, потом все остальное. Если я попытаюсь построить с помощью jom, заказ больше не будет выполнен. jom, кажется, пытается выполнить MIDL и RC параллельно: тогда Button.tlb еще не существует в то время, когда он нужен RC.exe, и сборка завершается ошибкой.

Есть ли способ заставить jom ждать выполнения midl перед запуском rc?

Я использую QT 5.3.1 под MSVC2013.


person NonoxX    schedule 14.08.2019    source источник


Ответы (1)


QMake — это не что иное, как генератор make-файлов. И ваша проблема связана с выполнением (или jom) параллельного выполнения задания. Чтобы исправить это, вам нужно всего лишь вызвать единственную зависимость (без какого-либо рецепта) в Makefile между res/obj и tlb файлами. Это можно сделать с помощью:

dep_restlb.target = $(RES_FILE)
dep_restlb.depends = $${DESTDIR}/Button.tlb # QMAKE_FILE_BASE is not available here
QMAKE_EXTRA_TARGETS += dep_restlb
person Matt    schedule 14.08.2019
comment
Должен признаться, я не мог ожидать, что это будет так просто... ${RES_FIL} не существует, поэтому мне пришлось изменить его следующим образом: ``` dep_restlb.target = $$OBJECTS_DIR\Button.res dep_restlb .depends = $${DESTDIR}/Button.tlb QMAKE_EXTRA_TARGETS += dep_restlb ``` ... и это помогло! Спасибо за вашу помощь! - person NonoxX; 14.08.2019
comment
@NonoxX ${RES_FILE} будет определен в Makefile. Таким образом, один доллар. - person Matt; 14.08.2019
comment
Это определенно не ``` Ошибка: неверный вызов макроса найден в E:\Projects\Button\Makefile, строка 463 ``` - person NonoxX; 14.08.2019
comment
@NonoxX Странно, я был уверен, что это определено и для nmake. Хорошо, тогда это относится только к генератору gcc. - person Matt; 14.08.2019
comment
Кажется, я выяснил: ${RES_FILE} не существует. $(RES_FILE) есть :) Все еще нужно избавиться от него в distclean, так как по этой причине он не существует на тот момент. - person NonoxX; 14.08.2019
comment
@NonoxX Ах, значит, nmake/jom просто не любит синтаксис POSIX. - person Matt; 14.08.2019