c - 使用Clang编译器通过Make构建LLVM项目时出现怪异标志

标签 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编译器,而google的一个快速搜索显示知道这些参数的含义的有用答案这就是我的生成文件的外观:
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

最佳答案

这个问题实际上有几个层次,所以我将把它分为三个部分:讨论在backticks中发生了什么,未知参数错误,以及没有这样的文件或目录错误。
什么是llvm-config
llvm-config是LLVM基础结构的一个工具,它获取编译需要LLVM的程序所需的配置信息因此,针对1的注释,llvm-config实际上是用于clang,当clang用于编译LLVM项目时。
--cflags选项提供了包括LLVM头的C编译器标志,您在llvm-config --cflags的输出中看到了这些标志你说过
它说没有像-wd4146等参数,但我没有将它们传递给clang编译器
但是,通过将它放在backticks中,shell从llvm-config --cflags获取输出并将其粘贴到原始命令中所以你包括了那些论点,你只是没有意识到!
我还将注意到llvm-config的输出高度依赖于构建系统和LLVM的版本例如,当安装在Ubuntu Linux 14.05、LLVM 3.5和GNU Make以及忍者生成器上时,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,也不包含任何对窗口或预处理器参数的引用。
那些奇怪的选项是什么,比如/DWIN32/D_WINDOWS/W3/MP
/D定义源文件的预处理符号,在本例中为WIN32和uwindows2
/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-configclang版本不兼容您注意到您在路径中添加了C:\LLVM\llvm-new-build\Debug\bin,但这并不能保证为每个llvm-configclang实际执行的二进制文件来自同一位置如果您以前安装了一个规范的、预构建的clang二进制文件用于一般编译,那么它在您的路径中的位置将早于C:\LLVM\llvm-new-build\Debug\bin预先构建的二进制文件中不太可能包含llvm-config重要的原因是,如果版本之间不匹配,llvm-config生成的必需include标志可能与clang所需的必需include标志不匹配在类Unix计算机上使用which和在Windows Server 2003之后的Windows计算机上使用where.exe可以验证执行路径跟踪是否没有发生我们希望它们都能反映出执行路径实际上是C:\LLVM\llvm-new-build\Debug\bin如果不是,那就是你的问题我相信这就是造成问题的原因,比如-wd4146-wd4180等选项。
没有这样的文件或目录:构建LLVM时,cmake检测到您正在Windows上构建,并生成了Visual Studio生成器文件同时,您的项目似乎使用了某种GNU Make-like构建系统有关在安装时选择发电机的更多讨论,请参见here我相信MSVC和另一个GNU的Make-like构建系统之间的混合导致了/DWIN32/D_WINDOWS/W3/MP等选项的问题。

关于c - 使用Clang编译器通过Make构建LLVM项目时出现怪异标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770889/

相关文章:

c - c中的浮点不准确

vim - Vim中的clang_complete

clang - 在 C 代码中使用 memcpy 并使用 wasm 目标进行编译时出现 llvm-link 错误

c++ - llvm clang 2.6 : "not using the clang compiler for C++ inputs "

metadata - 如何从 llvm 的元数据中获取字段名称

c - switch 语句中的独立中断

c - 空格键是字符吗

c - 在内存中压缩数据膨胀

xcode - 可以告诉clang不要分析某些文件吗?

c++ - 如何告诉 ld 在哪里可以找到 libc