Почему cl.exe не генерирует вывод, когда я вызываю его из Perl? - PullRequest
2 голосов
/ 07 января 2010

У меня странная проблема с запуском cl.exe, что поставило меня в тупик. В большом решении VS2008, состоящем из проектов C / C ++, у меня есть один проект, который выполняет несколько сценариев, чтобы выполнить дополнительную обработку. Проект состоит из события перед сборкой, которое вызывает скрипт Perl (ActiveState Perl находится на компьютере). Этот сценарий Perl вызывает cl.exe с /E для генерации предварительно обработанного вывода, который перенаправляется в файл. Строка в Perl выглядит так:

my $foo = `"\path\to\cl.exe" @args.rsp >out.txt 2>err.txt`;

args.rsp - это простой текстовый файл, содержащий набор аргументов командной строки для cl.exe, включая /E для получения вывода препроцессора на стандартный вывод.

Эта точная командная строка работает должным образом при запуске из командной строки VS2008. Сборка проекта также работает на моем компьютере с Windows XP. Однако в моем новом окне Windows 7 при сборке проекта out.txt заканчивается пустым. Я также должен добавить, что на некоторых компьютерах Windows 7 моего коллеги он работает нормально, а на некоторых - нет.

Очевидно, что происходит какая-то разница в конфигурации, но я не знаю, что это может быть. Мы проверили соответствующие версии VS2008 SP1 и ActiveState Perl. Я пробовал множество обходных путей в скрипте perl - используя system() вместо обратных кавычек, используя cl.exe /P для вывода в файл, а затем перемещая файл (файл пуст), отключая переменную окружения VS_UNICODE_OUTPUT (без эффекта ). Ничто не изменило поведение - выходные данные генерируются, когда командная строка запускается вручную, но не когда она запускается внутри события предварительной сборки для этого проекта.

Любые идеи о том, какие проблемы конфигурации могут быть причиной этого? У меня практически нет возможностей для продолжения.

Ответы [ 3 ]

2 голосов
/ 07 января 2010

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

Я считаю, что настройка в локальной политике | Аудиторская Политика | Аудит доступа к объектам

1 голос
/ 08 января 2010

Ничего себе, решение этой проблемы оказалось гораздо более странным, чем я ожидал. Машиной, на которой я работаю (и другими коллегами, которые также сталкиваются с этой проблемой), является Mac Pro с установленным bootcamp и Windows 7. Это заставляет C: иметь диск Windows, а E: иметь диск Mac. Это вызывает проблему, потому что событие предварительной сборки имеет пару строк, которые проверяют каждую букву диска, чтобы увидеть, есть ли там диск, и, если он есть, добавляет X: \ Perl \ bin к пути. Даже если E: \ Perl \ bin не существует, он добавляется в путь. Позже скрипт perl запускается и затем вызывает cl.exe, и по какой-то причине наличие каталога на диске Mac приводит к сбою cl.exe. Зачем? Я понятия не имею. В любом случае, удаление директории диска Mac из пути решает проблему!

Спасибо всем за глаза.

0 голосов
/ 07 января 2010

Проверьте код выхода вашей программы. Возможно, вы захотите создать ваше исполняемое имя переносимым способом, используя что-то вроде File :: Spec . Также убедитесь, что @args не интерполирует. Вы можете распечатать командную строку перед выполнением, чтобы убедиться, что это то, что вам нужно. Что осталось в вашем err.txt файле?

...