使用Clang编译器使用Make构建LLVM项目时出现奇怪的标志

时间:2015-01-04 22:07:07

标签: c clang llvm clang++

我最近将LLVM构建到以下路径:C:\LLVM\llvm-new-build。然后我将此路径添加到我的环境变量/路径C:\LLVM\llvm-new-build\Debug\bin。我正在尝试构建我的LLVM项目,但是我从Clang获得了一些奇怪的输出:

clang `llvm-config --cflags` -Wall -Iincludes/ src/*.c -c src/*.c
clang.exe: error: unknown argument: '-wd4146'
clang.exe: error: unknown argument: '-wd4180'
clang.exe: error: unknown argument: '-wd4244'
clang.exe: error: unknown argument: '-wd4258'
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: '-wd4456'
clang.exe: error: unknown argument: '-wd4457'
clang.exe: error: unknown argument: '-wd4458'
clang.exe: error: unknown argument: '-wd4459'
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: error: no such file or directory: 'C:/Program Files (x86)/Git/DWIN32'

clang.exe: error: no such file or directory: 'C:/Program Files (x86)/Git/D_WINDO
WS'
clang.exe: error: no such file or directory: 'C:/Program Files (x86)/Git/W3'
clang.exe: error: no such file or directory: 'C:/Program Files (x86)/Git/MP'
Makefile:22: recipe for target 'all' failed
make: *** [all] Error 1

它说没有-wd4146之类的论据,但是我还没有将它们传递给clang编译器,快速谷歌搜索显示了对这些含义的有用答案。这就是我的构建文件:

LCC = clang
LCXX = clang++

LLVM_CC_FLAGS=`llvm-config --cflags`
LLVM_LINK_FLAGS=`llvm-config --libs --cflags --ldflags core analysis executionengine jit interpreter native`

C_FLAGS = -Wall -Iincludes/
CXX_FLAGS = -Wall -Wextra -Wno-self-assign

SOURCES = src/*.c

all: ${SOURCES}
    ${LCC} ${LLVM_CC_FLAGS} ${C_FLAGS} ${SOURCES} -c ${SOURCES}
    ${LCXX} ${LLVM_LINK_FLAGS} *.o ${LLVM_FLAGS} -o j4
    -rm *.o

llvm-config --cflags

的输出
-IC:/LLVM/llvm/include -IC:/LLVM/llvm-new-build/include  /DWIN32 /D_WINDOWS /W3
  /MP -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEP
RECATE -D_CRT_NONSTDC_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WA
RNINGS -wd4146 -wd4180 -wd4244 -wd4258 -wd4267 -wd4291 -wd4345 -wd4351 -wd4355 -
wd4456 -wd4457 -wd4458 -wd4459 -wd4503 -wd4624 -wd4722 -wd4800 -w14062 -we4238 -
D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

1 个答案:

答案 0 :(得分:0)

这个问题确实有几个层次,所以我将尝试将其分解为三个部分:讨论反引号中发生的事情,未知参数错误,以及< em>没有这样的文件或目录错误。

什么是llvm-config

llvm-config是LLVM基础结构的工具,可获取编译需要LLVM的程序所需的配置信息。因此,在回复1上的评论时,当使用clang编译LLVM项目时,llvm-config实际旨在与clang 一起使用。

--cflags选项提供C编译器标志,包括LLVM标头,您在输出中看到llvm-config --cflags。你说

  

“它说没有像-wd4146之类的参数,但我没有将它们传递给clang编译器”

但是通过将它放在反引号中,你的shell从llvm-config --cflags获取输出并将其粘贴到原始命令中。所以你确实包含了这些论点,你只是没有意识到它!

我还要注意llvm-config的输出高度依赖于您的构建系统和LLVM的版本。例如,当安装在Ubuntu Linux 14.05,LLVM 3.5和GNU Make和Ninja生成器上时,llvm-config --cflags的输出是:

-I/.../llvm-3.5.0/llvm/include -I/.../llvm-3.5.0/build/include  -fPIC -Wall -W -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-comment -ffunction-sections -fdata-sections -g  -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

它明显不包括任何违规选项,如-wd4146-wd4180,也不包括对Windows或预处理器参数的任何引用。

/DWIN32/D_WINDOWS/W3/MP这些奇怪的选项是什么?

  • / D定义源文件的预处理符号,在本例中为WIN32和_WINDOWS。 2
  • / W3指示MSVC显示级别1,级别2和级别3(生产质量)警告。 3
  • / MP使MSVC创建自身的多个实例并尝试并行构建项目。 4

问题是它们被传递给前缀为正斜杠的编译器参数(注意所有其他选项都是用连字符传递的)。因此,您的构建尝试将这些文件名作为文件名处理,如结果错误所示,例如:

clang.exe: error: no such file or directory: 'C:/Program Files (x86)/Git/DWIN32'

为什么查看C:/Program Files (x86)/...取决于LLVM安装和/或操作系统的某些方面。我猜它是你执行路径中的最后一个位置,或者它是你现在的工作目录。

-wd4146-wd4180这些奇怪的选项是什么?

这些是禁用为MSVC发出的某些警告的选项。例如, C4146 为“unary minus operator applied to unsigned type, result still unsigned”, C4180 为“qualifier applied to function type has no meaning; ignored

Here's an example执行完全相同的操作,但是从GNU Make文件中而不是从命令行(查看块开始if (MSVC)

那为什么不是我的项目建设?

如果不检查LLVM构建,我无法权威地回答这个问题。但是,

  • 未知参数:您发现自己的llvm-config版本与clang版本不兼容。您注意到您在路径中添加了C:\LLVM\llvm-new-build\Debug\bin,但这并不能确保llvm-configclang中每个实际执行的二进制文件来自同一位置。如果您之前已经安装了用于通用编译用法的规范的预构建二进制文件,则其位置将在您的路径中早于C:\LLVM\llvm-new-build\Debug\binllvm-config不太可能包含在您预先构建的二进制文件中。重要的是,如果版本之间存在不匹配,则llvm-config生成的必需包含标志可能与clang所需的包含标志不匹配。在Windows Server 2003之后,您可以在类似Unix的计算机上使用which并在Windows计算机上使用where.exe验证执行路径阴影是否未发生。我们希望它们都反映实际执行路径{ {1}}。如果没有,那就是你的问题。 我认为这是通过C:\LLVM\llvm-new-build\Debug\bin-wd4146等选项创建问题的原因。
  • 没有此类文件或目录:构建LLVM时,cmake检测到您正在Windows上构建,并生成了Visual Studio生成器文件。同时,您的项目似乎使用某种GNU Make-like构建系统。有关在安装时选择生成器的更多讨论,请参阅here我认为MSVC与另一个GNU Make-like构建系统之间的混合是通过-wd4180/DWIN32/D_WINDOWS/W3等选项创建问题的原因