【问题标题】:Why doesn't llvm-config on Windows emit the correct parameters for clang++.exe?为什么 Windows 上的 llvm-config 不为 clang++.exe 发出正确的参数?
【发布时间】:2016-04-13 00:00:48
【问题描述】:

我不是经验丰富的 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编译了。

原始 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'

结果现在包含在 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*** 开关有什么用?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      为什么 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
      

      【讨论】:

      • 我认为您应该将其命名为“Visual Studio 工具链”而不是“Windows 工具链”。
      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2012-11-26
      • 2014-03-28
      • 2018-08-19
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多