2013-04-13 47 views
0

我已經建立與VS9後manual鐺編譯器掛在窗戶上

它的構建沒有錯誤。但是,當我試圖編譯一些代碼 - 它掛起(不消耗週期,兩個過程),無論是軀幹和3.2版本:

> "bin\clang++.exe" -c test.cpp -o test.bs -emit-llvm -v 

clang version 3.2 (tags/RELEASE_32/final) 
Target: i686-pc-win32 
Thread model: posix 
"C:/llvm/bin/clang++.exe" -cc1 -triple i686-pc-win32 -emit-llvm-bc -disable-free -main-file-name test.cpp -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -target-cpu pentium4 -momit-leaf-frame-pointer -v -coverage-file "C:\\llvm\\test.bs" -resource-dir "C:/llvm/bin\\..\\lib\\clang\\3.2" -fmodule-cache-path "C:\\Users\\qble\\AppData\\Local\\Temp\\1\\clang-module-cache" -internal-isystem C:/llvm/bin/../lib/clang/3.2/include -internal-isystem -std=c++11 -fdeprecated-macro -ferror-limit 19 -fmessage-length 0 -mstackrealign -fms-extensions -fms-compatibility -fmsc-version=1300 -fdelayed-template-parsing -fobjc-runtime=gcc -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -o test.bs -x c++ test.cpp 
clang -cc1 version 3.2 based upon LLVM 3.2svn default target i686-pc-win32 -std=c++11 -fdeprecated-macro -ferror-limit 19 -fmessage-length 0 -mstackrealign -fms-extensions -fms-compatibility -fmsc-version=1300 -fdelayed-template-parsing -fobjc-runtime=gcc -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -o test.bs -x c++ test.cpp " 
#include "..." search starts here: 
#include <...> search starts here: 
C:/llvm/bin/../lib/clang/3.2/include 
End of search list. 
[HANG IS HERE]^C 

有什麼不對?如何使它工作?

編輯:

你能找到其中第二進程啓動?它的標準輸入重定向到管道?

二proccess這裏執行,它是 「clang.exe」:

>clang.exe!llvm::sys::Program::ExecuteAndWait(const llvm::sys::Path & path={...}, const char * * args=0x001ba3f0, const char * * envp=0x00000000, const llvm::sys::Path * * redirects=0x00000000, unsigned int secondsToWait=0, unsigned int memoryLimit=0, std::basic_string<char,std::char_traits<char>,std::allocator<char> > * ErrMsg="") line 34 C++ 
clang.exe!clang::driver::Compilation::ExecuteCommand(const clang::driver::Command & C={...}, const clang::driver::Command * & FailingCommand=0x00000000) line 282 + 0x24 bytes C++ 
clang.exe!clang::driver::Compilation::ExecuteJob(const clang::driver::Job & J={...}, const clang::driver::Command * & FailingCommand=0x00000000) line 298 + 0x10 bytes C++ 
clang.exe!clang::driver::Compilation::ExecuteJob(const clang::driver::Job & J={...}, const clang::driver::Command * & FailingCommand=0x00000000) line 303 + 0x12 bytes C++ 
clang.exe!clang::driver::Driver::ExecuteCompilation(const clang::driver::Compilation & C={...}, const clang::driver::Command * & FailingCommand=0x00000000) line 508 + 0x15 bytes C++ 
clang.exe!main(int argc_=3, const char * * argv_=0x001b28c0) line 476 + 0x1e bytes C++ 

編輯:

如果我運行:

type test.cpp | ..\build\bin\Debug\clang.exe -emit-llvm -c test.cpp -o test.bs 

或命令行從上面鐺直接輸出 - 我得到真正的編譯錯誤(關於標題)。所以,它看起來像解析/傳遞參數的問題。

+1

由於您構建了'clang',因此可以使用調試符號重建它。然後捕獲堆棧跟蹤。 –

+0

我這樣做 - 它等待第二個進程,但我沒有檢查第二個進程在做什麼。 – qble

+0

@ BenVoigt hm,第二個進程等待來自的輸入 – qble

回答

1

問題出在我身上INCLUDE env var。它有一個像

路徑
c:\some\dir\ 

鐺通過它來子過程(贏CreateProcess的接受級聯參數):

clang.exe someargs "c:\some\dir\" otherargs 

,看起來像由於最後一個反斜槓,雙引號是「逃脫」,因爲argv_在子是:

somepath/clang.exe 
someargs 
c:\some\dir" otherargs 

注反斜線是如何「拿來主義」,而值其它與該路徑連接,爲什麼它等待 - 它沒有得到參數的一部分。

鏘的計劃::執行應固定在支架反斜槓或解析代碼的逃逸INCLUDE的環境變量。

EDIT from Stefan v.K:在llvm錯誤跟蹤器中的對應條目與可能的補丁。 http://llvm.org/bugs/show_bug.cgi?id=15802

+0

好的捕獲,同時我想你可以通過沒有尾隨反斜槓來解決它。或者使用POSIX風格的目錄分隔符'/'。 –

+0

是的,這正是所做的(兩者:刪除後綴,並將其他人轉換爲'/') – qble

+0

@artlessnoise謝謝!所以,正如bug報告一樣,我正在接受答案。 – qble