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

时间:2016-01-08 10:28:20

标签: windows llvm clang++ llvm-clang ghdl

我没有经验丰富的LLVM用户,但我试图在Windows上编译Linux LLVM项目。该项目是GHDL。

因为Windows的现成LLVM安装程序没有捆绑llvm-config,所以我需要编译LLVM并从源代码中获得批处理。该项目需要LLVM 3.5。

首先,我下载了llvm-3.5.2clang-3.5.2并使用CMake将其转换为Visual Studio 2013项目。然后我用VS2013编译它。

原始makefile调用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:\Tools\LLVM-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:\Tools\LLVM-3.5/include
  2. 某些开关和参数与-其他/的用户一起使用 ... -IC:\Tools\LLVM-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'

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

    Command: 'C:\Tools\LLVM-3.5\bin\clang++.exe -c -c -v -IC:\Tools\LLVM-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 ../../src\ortho\llvm\llvm-bindings.cpp -o llvm-cbindings.o ../../src\ortho\llvm\llvm-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***开关是什么?

2 个答案:

答案 0 :(得分:5)

  

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

     

我该如何解决?

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

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

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

在致电clang-cl时:

PS C:\Users\XXX> clang-cl -wd4146
clang-cl.exe: error: no input files

按预期工作。这是因为GNU和Visual Studio工具链对前端有不同的命令行标志。这导致了您的上一个问题:

  

这些-wd ***开关是什么?

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

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

答案 1 :(得分:0)

对于仍在挣扎中的任何人,有一种方法可以使Powershell中的llvm-config与clang一起使用:

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

由于某种原因,clang将不拆分的llvm-config输出视为单个大参数。