clang-cl /fallback 模式

類別: IT

最近在Windows平臺出現了很多的LLVM工具 (參見 Windows下的LLVM工具鏈先鋒). 這導致了一種新的Clang驅動模式: clang-cl的產生. 這種方式可以使Clang能用Visual Studio的編譯器,像cl.exe來編譯程式。舉個例子, 一個典型的Clang編譯命令列指令為"clang hello.cc -o hello", 現在我們用cl.exe的命令好語法來編譯,使用"cl.exe hello.cc /Fehello". 這樣我們可以用 "cl.exe" 的指令來編譯"clang-cl"的程式. 這會易於Clang在Visual Studio實現專案了.

大多數情況下, clang-cl的引數跟cl.exe都是一致的. 然而, 他也接受Clang的一些特定選項. 最近加入了/fallback標記. 這個標記的目的是為了編譯一些Clang不能編譯的程式碼。下面將給出例子如何使用 /fallback 標記.

clang-cl工作在 /fallback模式下是首次嘗試編譯Clang的程式碼,如果失敗,出於某種原因,它會使用cl.exe來嘗試編譯.參照一下兩個檔案,main.cpp可以通過編譯,printer.cpp編譯不能通過:
printer.cpp:#include <iostream>void print_hello(const char *s) {  std::cout << "Hello from " << s << "!" << std::endl;}
main.cpp:extern void print_hello(const char*);int main(int argc, char **argv) {  print_hello(argv[0]);  return 0;}
clang-cl 不能編譯 printer.cpp因為它引用了iostream,但iostream使用了一個不能完全支援的語言特性(希望他們趕緊被支援)。 clang-cl 依然可以使用 / fallback 模式來編譯這兩個檔案:
clang-cl /fallback /Fehello main.cpp printer.cpp

Clang會成功編譯main.cpp,列印一些關於他不支援printer.cpp的錯誤資訊, 並回退到cl.exe來編譯這個檔案.編譯完成的檔案會被連線到hello.exe這個檔案上.

注意: 即使clang-cl認為它編譯成功了一個檔案,也很有可能在編譯完成的程式碼在執行時會導致一些bug或 failure的產生.

到現在, /fallback 模式可能會導致clang-cl 產生各種錯誤問題。將來,它將改善到會導致一些內部錯誤,隨著Windows對Clang的支援的加深,/fallback 就可以不必要使用甚至可以永久的從規範中刪除了。clang-cl仍處於初級階段, 但你可以自己嘗試從LLVM快速構建站點下載到它的工具鏈。

clang-cl /fallback 模式原文請看這裡