为什么 Windows 上的 llvm-config 没有为 clang++.exe 发出正确的参数?
Why doesn't llvm-config on Windows emit the correct parameters for clang++.exe?
我不是经验丰富的 LLVM 用户,但我正在尝试在 Windows 上编译一个 Linux LLVM 项目。该项目是GHDL。
因为 Windows 的即用型 LLVM 安装程序没有捆绑 llvm-config
,我需要从源代码编译 LLVM 和 clange。该项目需要 LLVM 3.5.
所以首先,我下载了 llvm-3.5.2
和 clang-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
我注意到几个问题:
- 一些路径有
/
而不是 \
-IC:\Tools\LLVM-3.5/include
- 一些开关和参数与
-
一起使用,其他开关和参数与 /
一起使用
... -IC:\Tools\LLVM-3.5/include /DWIN32 /D_WINDOWS ...
- 一些参数由一个以上的space符号分隔
... /W3 /MP ...
- clang++.exe 在未知参数上打印错误:
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++.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***
开关有什么用?
Why does llvm-config emit false results on Windows?
How can I fix it?
没有。 llvm-config 为您提供了正确的参数,但您为 Windows 使用了错误的前端。 clang++ 是为最初具有 GNU 编译器 tool-chain(g++ 等)的平台构建的。 Windows 前端 (clang-cl) 是 Visual Studio tool-chain 的替代品,并接受 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 tool-chain 有不同的前端命令行标志。这就引出了你的最后一个问题:
What are these -wd*** switches for?
使用 -wd*** 开关可以禁用特定的编译器警告,例如 4146 已记录 here:
C4146: unary minus operator applied to unsigned type, result still unsigned
对于仍在挣扎的任何人,有一种方法可以让 clang 在 Powershell 中与 llvm-config 一起工作:
> clang $($(llvm-config --cxxflags).split())
出于某种原因,llvm-config 没有拆分的输出被 clang 计为单个大参数。
我不是经验丰富的 LLVM 用户,但我正在尝试在 Windows 上编译一个 Linux LLVM 项目。该项目是GHDL。
因为 Windows 的即用型 LLVM 安装程序没有捆绑 llvm-config
,我需要从源代码编译 LLVM 和 clange。该项目需要 LLVM 3.5.
所以首先,我下载了 llvm-3.5.2
和 clang-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
我注意到几个问题:
- 一些路径有
/
而不是\
-IC:\Tools\LLVM-3.5/include
- 一些开关和参数与
-
一起使用,其他开关和参数与/
一起使用... -IC:\Tools\LLVM-3.5/include /DWIN32 /D_WINDOWS ...
- 一些参数由一个以上的space符号分隔
... /W3 /MP ...
- clang++.exe 在未知参数上打印错误:
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++.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***
开关有什么用?
Why does llvm-config emit false results on Windows?
How can I fix it?
没有。 llvm-config 为您提供了正确的参数,但您为 Windows 使用了错误的前端。 clang++ 是为最初具有 GNU 编译器 tool-chain(g++ 等)的平台构建的。 Windows 前端 (clang-cl) 是 Visual Studio tool-chain 的替代品,并接受 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 tool-chain 有不同的前端命令行标志。这就引出了你的最后一个问题:
What are these -wd*** switches for?
使用 -wd*** 开关可以禁用特定的编译器警告,例如 4146 已记录 here:
C4146: unary minus operator applied to unsigned type, result still unsigned
对于仍在挣扎的任何人,有一种方法可以让 clang 在 Powershell 中与 llvm-config 一起工作:
> clang $($(llvm-config --cxxflags).split())
出于某种原因,llvm-config 没有拆分的输出被 clang 计为单个大参数。