Почему добавление флага компоновщика `-save-temps` устраняет ошибку clang-8: невозможно создать временный файл?

Я использую набор инструментов Windows + Cygwin + Eclipse + LLVM для создания проекта C/C++.

Файлы прекрасно компилируются компилятором clang C, но компоновка с помощью clang++ завершается неудачно с несколькими error: unable to make temporary file: No such file or directory.

clang++ -o test "source1.bc" "source2.bc" "source3.bc" 
clang-8: error: unable to make temporary file: No such file or directory
clang-8: error: unable to make temporary file: No such file or directory
clang-8: error: unable to make temporary file: No such file or directory

Компоновщик генерирует одну ошибку для каждого объектного файла.

Когда я добавляю параметр -save-temps в компоновщик, он работает нормально!

В чем может быть проблема?

Добавление --verbose дает:

clang version 8.0.1 (tags/RELEASE_801/final) Target: x86_64-unknown-windows-cygnus
Thread model: posix
InstalledDir: /usr/bin
clang-8: error: unable to make temporary file: No such file or directory
clang-8: error: unable to make temporary file: No such file or directory
clang-8: error: unable to make temporary file: No such file or directory

Я проверил переменные TMP и TEMP - вроде все в порядке. Я попытался изменить TMP и TEMP, чтобы включить завершающую косую черту /, я также попробовал весь путь с обратной косой чертой \ или прямой косой чертой / - ничего не помогло.

Вот более подробный вывод.

Во-первых, вот выходные данные с флагами -save-temps и -###:

 "/usr/bin/clang-8" "-cc1" "-triple" "x86_64-unknown-windows-cygnus" "-S" "-save-temps=cwd" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "my_files\\my_file1.bc" "-mrelocation-model" "pic" "-pic-level" "2" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-munwind-tables" "-target-cpu" "x86-64" "-dwarf-column-info" "-debugger-tuning=gdb" "-momit-leaf-frame-pointer" "-v" "-resource-dir" "/usr/lib/clang/8.0.1" "-fdebug-compilation-dir" "/cygdrive/c/my_projects/prj1/Debug" "-ferror-limit" "19" "-fmessage-length" "0" "-fobjc-runtime=gcc" "-fseh-exceptions" "-fdiagnostics-show-option" "-o" "my_files\\my_file1.s" "-x" "ir" "my_files\\my_file1.bc" "-faddrsig"

Вот вывод без -save-temps, только -###:

 "/usr/bin/clang-8" "-cc1" "-triple" "x86_64-unknown-windows-cygnus" "-emit-obj" "-mrelax-all" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "my_files\\my_file1.bc" "-mrelocation-model" "pic" "-pic-level" "2" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-munwind-tables" "-target-cpu" "x86-64" "-dwarf-column-info" "-debugger-tuning=gdb" "-momit-leaf-frame-pointer" "-v" "-resource-dir" "/usr/lib/clang/8.0.1" "-fdebug-compilation-dir" "/cygdrive/c/my_projects/prj1/Debug" "-ferror-limit" "19" "-fmessage-length" "0" "-fobjc-runtime=gcc" "-fseh-exceptions" "-fdiagnostics-show-option" "-o" "" "-x" "ir" "my_files\\my_file1.bc" "-faddrsig"

Таким образом, "-o" "my_files\\my_file1.s" против "-o" "" кажется разницей. Есть объяснение?

Также еще немного вывода с флагами -save-temps, -###:

"/usr/bin/ld" "-m" "i386pep" "--wrap" "_Znwm" "--wrap" "_Znam" "--wrap" "_ZnwmRKSt9nothrow_t" "--wrap" "_ZnamRKSt9nothrow_t" "--wrap" "_ZdlPv" "--wrap" "_ZdaPv" "--wrap" "_ZdlPvRKSt9nothrow_t" "--wrap" "_ZdaPvKSt9nothrow_t" "-Bdynamic" "--tsaware" "-o" "myexecutable" "/usr/lib/crt0.o" "/usr/lib/gcc/x86_64-pc-cygwin/10/crtbegin.o" "-LC:/mylibraries" "-L/usr/lib/gcc/x86_64-pc-cygwin/10" "-L/usr/x86_64-pc-cygwin/lib" "-L/usr/lib" "-L/usr/lib/w32api" "my_files\\my_file1.o" "my_files\\my_file2.o" " my_files\\my_file3.o" "-lnaturedsp" "-lgcc_s" "-gcc" "-lcygwin" "-ladvapi32" "-lshell32" "-luser32" "-lkernel32" "/usr/lib/default-manifest.o" "/usr/lib/gcc/x86_64-pc-cygwin/10/crtend.o"

и только с -###:

"/usr/bin/ld" "-m" "i386pep" "--wrap" "_Znwm" "--wrap" "_Znam" "--wrap" "_ZnwmRKSt9nothrow_t" "--wrap" "_ZnamRKSt9nothrow_t" "--wrap" "_ZdlPv" "--wrap" "_ZdaPv" "--wrap" "_ZdlPvRKSt9nothrow_t" "--wrap" "_ZdaPvKSt9nothrow_t" "-Bdynamic" "--tsaware" "-o" "myexecutable" "/usr/lib/crt0.o" "/usr/lib/gcc/x86_64-pc-cygwin/10/crtbegin.o" "-LC:/mylibraries" "-L/usr/lib/gcc/x86_64-pc-cygwin/10" "-L/usr/x86_64-pc-cygwin/lib" "-L/usr/lib" "-L/usr/lib/w32api" "" "" "" "-lnaturedsp" "-lgcc_s" "-lgcc" "-lcygwin" "-ladvapi32" "-lshell32" "-luser32" "-lkernel32" "/usr/lib/default-manifest.o" "/usr/lib/gcc/x86_64-pc-cygwin/10/crtend.o"

Итак, снова "my_files\\my_file1.o" "my_files\\my_file2.o" "my_files\\my_file3.o" теряются и заменяются пустыми строками "" "" "".

Еще одна вещь, как указано в списке рассылки clang: ни опция драйвера -save-temps, ни опция компоновщика --save-temps (опция драйвера -Wl, --save-temps) не учитывают TMP/TEMP/TMPDIR. Временные файлы сохраняются относительно текущего рабочего каталога...

Итак, речь идет не о временном расположении каталога.


person Danijel    schedule 24.07.2020    source источник
comment
Попробуйте это: stackoverflow.com/a/44005867/13912132 (я знаю, что это о git, но, возможно, это та же основная причина ???)   -  person JCWasmx86    schedule 24.07.2020
comment
@ JCWasmx86 Косая черта в конце не помогла.   -  person Danijel    schedule 11.08.2020
comment
Вы пытались включить подробный вывод для получения контекста? Что ты получил? Пожалуйста, отредактируйте свой вопрос при добавлении новой информации.   -  person the busybee    schedule 14.09.2020
comment
@thebusybee Добавление -verbose дает: clang version 8.0.1 (tags/RELEASE_801/final) Target: x86_64-unknown-windows-cygnus Thread model: posix InstalledDir: /usr/bin clang-8: error: unable to make temporary file: No such file or directory clang-8: error: unable to make temporary file: No such file or directory clang-8: error: unable to make temporary file: No such file or directory   -  person Danijel    schedule 21.09.2020
comment
Как я уже сказал, пожалуйста, добавляйте новую информацию к своему вопросу, не размещайте ее здесь, в комментариях, где она потеряется и не будет прочитана. -- Если я добавлю -v или --verbose к вызову clang++, я получу намного больше вывода, включая командные строки вызываемых базовых инструментов. Но моя установка может отличаться от вашей. У вас может быть общая проблема с вашей системой, например, отсутствующие переменные среды TMP и/или TEMP или, если они у вас есть, указывают на несуществующие или недоступные пути.   -  person the busybee    schedule 21.09.2020
comment
Что показывает ваше исследование существования и прав пути для временного файла? Вы пытались выяснить, где clang пытается создать этот файл? Вы можете создать файл в том же месте?   -  person the busybee    schedule 01.10.2020
comment
Подробный вариант не дает слишком много информации. Имейте в виду, что проблема заключается на этапе связывания - компиляция проходит нормально. Кроме того, именно опция компоновщика -save-temps помогает решить проблему. Однако линковка с этой опцией ужасно медленная.   -  person Danijel    schedule 02.10.2020
comment
Пытался получить больше информации с помощью -###, возможно, это поможет.   -  person Danijel    schedule 05.10.2020