为什么 Windows 上的 llvm-config 没有发出 clang++.exe 的正确参数?



我不是一个经验丰富的LLVM用户,但我正在尝试在Windows上编译一个Linux LLVM项目。该项目为GHDL。

因为Windows的现成LLVM安装程序没有捆绑llvm-config,所以我需要从源代码编译LLVM和clange。该项目需要LLVM 3.5。

因此,首先,我下载了llvm-3.5.2clang-3.5.2,并使用CMake将其翻译成Visual Studio 2013项目。然后我用VS2013来编译它

原始生成文件调用llvm-config。生成的字符串被传递给clang++:

clang++ -c -I`/usr/lib/llvm-3.5/bin/llvm-config --includedir --cflags --cxxflags` -o llvm-cbindings.o src/ortho/llvm/llvm-cbindings.cpp

我正在使用PowerShell调用llvm-config并将结果存储在一个变量中:

$LLVM_CONFIG_RESULT = & $LLVM_CONFIG --cxxflags

结果是:

-IC:ToolsLLVM-3.5/include  /DWIN32 /D_WINDOWS /W3     /MP -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -wd4146 -wd4180 -wd4244 -wd4267 -wd4291 -wd4345 -wd4351 -wd4355 -wd4503 -wd4624 -wd4722 -wd4800 -w14062 -we4238 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

我注意到几个问题:

  1. 某些路径具有/而不是
    -IC:ToolsLLVM-3.5/include
  2. 一些开关和参数与-一起使用,另一些与/一起使用
    ... -IC:ToolsLLVM-3.5/include /DWIN32 /D_WINDOWS ...
  3. 某些参数由多个空格符号分隔
    ... /W3 /MP ...
  4. clang++.exe在未知参数上打印错误:

    clang++.exe:错误:未知参数:"-wd4146"
    clang++.exe:错误:未知参数:"-wd4180"
    clang++.exe:错误:未知参数:"-wd4244"
    clang++.exe:错误:未知参数:"-wd4267"
    clang++.exe:错误:未知参数:"-wd4291"
    clang++.exe:错误:未知参数:"-wd4345"
    clang++.exe:错误:未知参数:'-wd4351'
    clang++.exe:错误:未知参数:"-wd4355"
    clang++.exe:错误:未知参数:"-wd4503"
    clang++.exe:错误:未知参数:"-wd4624"
    clang++.exe:错误:未知参数:"-wd4722"
    clang++.exe:错误:未知参数:"-wd4800"
    clang++.exe:错误:未知参数:"-w14062"
    clang++.exe:错误:未知参数:"-we4238"

结果现在包含在clang++.exe调用中,这会导致错误。

Command: 'C:ToolsLLVM-3.5binclang++.exe -c -c -v -IC:ToolsLLVM-3.5/include  /DWIN32 /D_WINDOWS /W3     /MP -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -wd4146 -wd4180 -wd4244 -wd4267 -wd4291 -wd4345 -wd4351 -wd4355 -wd4503 -wd4624 -wd4722 -wd4800 -w14062 -we4238 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -o llvm-cbindings.o ../../srcorthollvmllvm-bindings.cpp -o llvm-cbindings.o ../../srcorthollvmllvm-cbindings.cpp'  
clang++.exe: error: unknown argument: '-wd4146'  
clang++.exe: error: unknown argument: '-wd4180'  
clang++.exe: error: unknown argument: '-wd4244'  
clang++.exe: error: unknown argument: '-wd4267'  
clang++.exe: error: unknown argument: '-wd4291'  
clang++.exe: error: unknown argument: '-wd4345'  
clang++.exe: error: unknown argument: '-wd4351'  
clang++.exe: error: unknown argument: '-wd4355'  
clang++.exe: error: unknown argument: '-wd4503'  
clang++.exe: error: unknown argument: '-wd4624'  
clang++.exe: error: unknown argument: '-wd4722'  
clang++.exe: error: unknown argument: '-wd4800'  
clang++.exe: error: unknown argument: '-w14062'  
clang++.exe: error: unknown argument: '-we4238'  
clang version 3.5.2 (tags/RELEASE_352/final)  
Target: i686-pc-windows-msvc  
Thread model: posix  
clang++.exe: error: no such file or directory: '/DWIN32'  
clang++.exe: error: no such file or directory: '/D_WINDOWS'  
clang++.exe: error: no such file or directory: '/W3'  
clang++.exe: error: no such file or directory: '/MP'  

下面是我的问题:

  • 为什么llvm-config在Windows上会发出错误的结果
  • 我该怎么修
  • 这些-wd***开关是干什么用的

为什么llvm-config在Windows上发出错误的结果?

我该怎么修?

事实并非如此。llvm-config为您提供了正确的参数,但您使用了错误的Windows前端。clang++是为最初拥有GNU编译器工具链(g++等)的平台构建的。Windows前端(clang-cl)是Visual Studio工具链的替代品,接受llvm-config提供的值。

从您的用例调用clang++会导致:

PS C:UsersXXX> clang++ -wd4146
clang++.exe: error: unknown argument: '-wd4146'
clang++.exe: error: no input files

调用clang-cl:时

PS C:UsersXXX> clang-cl -wd4146
clang-cl.exe: error: no input files

按预期工作。这是因为GNU和VisualStudio工具链的前端有不同的命令行标志。这引出了你的最后一个问题:

这些-wd***开关是干什么用的?

使用-wd***开关可以禁用特定的编译器警告,例如4146在这里有记录:

C4146: unary minus operator applied to unsigned type, result still unsigned

对于任何仍在挣扎的人来说,有一种方法可以让clang在Powershell中使用llvm配置:

> clang $($(llvm-config --cxxflags).split())

由于某种原因,没有拆分的llvm配置输出被clang计算为一个大参数。

最新更新