Сообщение "Неверный номер файла" в случаях, которые я видел, вызвано слишком большим количеством аргументов, переданных функции execvp (command, argv)
(или аналогичной). Но только из некоторых программ. Старая bash , sh или программа Borland / Watcom в вашей PATH является вероятным кандидатом.
Таким образом, когда вы сокращаете имя каталога сборки, общий размер командной строки (который в конечном итоге передается CreateProcess()
) становится короче. Я не думаю, что UAC имеет к этому какое-либо отношение, так как я видел это и на Win-XP. Но немного странно, что Mozilla не использовала бы относительные пути при сборке. Я предполагаю, что он использует какой-то каталог prefix value в своих make-файлах (я никогда не пытался его собрать).
Если вы посмотрите документацию для _execvp()
:
http://msdn.microsoft.com/en-us/library/3xw6zy53.aspx
E2BIG - одно из возможных значений errno
:
Пространство, необходимое для аргументов и параметров среды, превышает 32 КБ.
Теперь вот странная часть.
Факт 1 :
На Visual-C / MingW (любая версия) strerror(EBADF)
не возвращает «Неверный номер файла» .
(возвращается «Неверный дескриптор файла »).
Факт 2 :
В CBland Borland 5.6 и Watcom 1.9 (они , а не используют среду выполнения MSVC), strerror(EBADF)
действительно возвращает «Неверный номер файла» .
Теория
Возможно ли, что Borland, Watcom (и другие CRT тоже?) Смешивают значения E2BIG
и EBADF
. Это имело какой-то смысл? Кто-нибудь, пожалуйста, поправьте меня, если у вас есть лучшая теория.
Я немного запуталась сама ...
Заключение :
Либо сократите размер вашей среды (проще всего), либо сократите командную строку (не всегда легко).
- г.в.