Как я могу получить MIDL для поиска дополнительных каталогов включения для уточненных путей - PullRequest
10 голосов
/ 09 августа 2009

Обновление: Через шесть месяцев после открытия обращения в службу поддержки Microsoft оно было отклонено, они утверждают, что это не ошибка (поскольку в документации явно не говорится, что наблюдаемое поведение не является правильный). Они отклонили 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 в качестве дополнительного каталога включения (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 готов искать относительные пути, только если они относятся к текущему каталогу, а не к одному из указанных дополнительных каталогов включения, и использует дополнительные каталоги включения только для неквалифицированных имен файлов, это поведение характерно для ключевого слова import, с использованием include результаты соответствуют ожидаемым.

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

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

1 Ответ

2 голосов
/ 16 июня 2012

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

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

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

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

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

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

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

MKLINK.exe может создавать соединения или символические ссылки.

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

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

...