Как я могу получить MIDL для поиска дополнительных каталогов include для квалифицированных путей

Обновление: Спустя более шести месяцев после открытия запроса поддержки в Microsoft он отклонен, они утверждают, что это не ошибка (так как в документации явно не указано, что поведение, t правильный). Они отклонили DCR, заявив, что, поскольку они не слышали никаких жалоб за последние 10 лет, это, очевидно, не общий вариант использования.

Это призыв к оружию, если вы столкнулись с той же проблемой, пожалуйста, откройте службу поддержки с Microsoft, чтобы они поняли, что она должна быть исправлена. Я знаю, что по крайней мере кто-то столкнулся с той же проблемой, потому что я нашел этот комментарий в исходный код Chrome:

# Создание файлов .idl.
 # Это полный беспорядок. MIDL нужно запустить из $OPEN_DIR, потому что он тоже  # глупо применять его включенные пути к относительному пути, например, "ui/ie/bla.idl"
 # (он отображается только в текущем каталоге). Поэтому нам нужно прыгать через обручи, чтобы исправить  # вверх наши относительные включают пути и выходные файлы.


Оригинальный вопрос:

У меня есть следующая структура файла:

  • C:\first\Foo.idl
  • C:\second\Bar.idl

Где Bar.idl содержит следующую строку:

import "first/Foo.idl";

Как я могу получить midl для компиляции Bar.idl при компиляции из C:\second?

Если я импортировал Foo.idl напрямую (без указания first/), то указать first в качестве дополнительного каталога include будет достаточно (midl /I c:\first Bar.idl), и он найдет Foo.idl

Альтернативно, если я скомпилирован из C:\ (midl second\Bar.idl), это тоже будет ОК.

Проблема заключается в том, что при компиляции из C:\second с командной строкой midl /I C:\ Bar.idl я получаю следующую ошибку компиляции:

c1: фатальная ошибка C1083: невозможно открыть исходный файл: 'first\Foo.idl': нет такого файла или каталога

Похоже, что midl хочет искать относительные пути только в том случае, если они относятся к текущему каталогу, а не к одному из указанных дополнительных каталогов include и использует дополнительные каталоги include только для имен неквалифицированных файлов, это поведение относится к ключевому слову import, используя include, результаты ожидаются.

Я хотел бы иметь возможность добавить два разных дополнительных каталога include, чтобы, если у меня есть файл на моем локальном компьютере midl, он примет эту версию, в противном случае он возьмет файл с сервера ( поэтому chdir в корневую папку не является вариантом).

Есть ли способ обойти это?

Ответ 1

Как вы заметили, хотя это глупо, поддержка Microsoft подтвердила, что это не ошибка. Возможные обходные пути:

1. Используйте переключатель /I. Много.

Используйте переключатель /I, чтобы указать как c:\first, так и c:\second, и укажите import "Foo.idl" вместо относительного пути.

Если командная строка слишком длинная, укажите файл ответа.

2. Используйте символические ссылки

Используйте символические ссылки или переходы в каталоги include, чтобы ссылаться на них в единую иерархию под известным каталогом. Затем вы можете использовать пути относительно этого каталога.

Для поддержания символических ссылок может использоваться шаг предварительной сборки.

MKLINK.exe может создавать переходы или символические ссылки.

3. Используйте дополнительный шаг сборки

Создайте дополнительный шаг сборки, который скопирует необходимые файлы в известные местоположения, затем вставьте их туда.