【问题标题】:Weird flags when building LLVM project with Make using the Clang Compiler使用 Clang 编译器使用 Make 构建 LLVM 项目时出现奇怪的标志
【发布时间】:2015-01-04 22:07:06
【问题描述】:

我最近将 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

【问题讨论】:

  • 如果你运行 just llvm-config --cflags,你会得到什么?
  • 我会在最后更新问题:)
  • 更新了问题,有什么想法吗?
  • 我在 Linux 上,但 AFAIK llvm-config 不适合 clang
  • 我不确定,我用 MinGW 尝试过,它给出了同样的错误。

标签: c clang llvm clang++


【解决方案1】:

这个问题确实有几个层次,所以我将尝试将其分解为三个部分:讨论反引号内发生的事情、unknown argument 错误和 没有这样的文件或目录错误。

什么是llvm-config

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

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

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

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

我还要注意,llvm-config 的输出高度依赖于您的构建系统和 LLVM 的版本。例如,当安装在带有 GNU Make 和 Ninja 生成器的 Ubuntu Linux 14.05、LLVM 3.5 上时,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-configclang 的版本不兼容。您注意到您在路径中添加了C:\LLVM\llvm-new-build\Debug\bin,但这并不能保证为llvm-configclang 中的每一个实际执行的二进制文件来自同一位置。如果您之前安装了一个规范的、预构建的 clang 二进制文件以用于通用编译,那么它在您的路径中的位置将比C:\LLVM\llvm-new-build\Debug\bin 更早。 llvm-config 不太可能包含在您的预构建二进制文件中。这很重要的原因是,如果版本之间不匹配,llvm-config 生成的所需包含标志可能与clang 所需的包含标志不匹配。您可以在类 Unix 机器上使用 which 和在 Windows Server 2003 之后的 Windows 机器上使用 where.exe 来验证执行路径阴影没有发生。我们希望它们都反映执行路径实际上是 C:\LLVM\llvm-new-build\Debug\bin。如果没有,那就是你的问题。 我相信这就是导致-wd4146-wd4180 等选项出现问题的原因。
  • 没有这样的文件或目录:当您构建 LLVM 时,cmake 检测到您正在 Windows 上构建,并生成了 Visual Studio 生成器文件。同时,您的项目似乎使用了某种类似 GNU Make 的构建系统。有关在安装时选择发电机的更多讨论,请参阅here我相信 MSVC 和另一个类似 GNU Make 的构建系统之间的混合是造成 /DWIN32/D_WINDOWS/W3/MP 等选项问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多