llvm - EnableABIBreakingChecks 编译失败

标签 llvm llvm-clang abi llvm-c++-api

我最近安装了 LLVM v8.0.0(在 RHEL 7.4 上)。我正在浏览LLVM Kaleidoscope tutorial了解如何使用该系统,但遇到链接问题。

根据教程( end of chapter 2 ),我运行:

clang++ -g -O3 kld.cpp `llvm-config --cxxflags` -o kld

它可以编译,但链接器失败:

/tmp/kld-f7264f.o:(.data+0x0): undefined reference to `llvm::EnableABIBreakingChecks'
clang-8: error: linker command failed with exit code 1 (use -v to see invocation)

我怀疑这可能是 llvm-config 的问题,因此我还尝试使用 --ldflags--system-libs 标志,但没有运气。

llvm-config --cxxflags 给出(重新格式化以提高可读性)

-I~/project/llvm-src/include -I~/project/llvm-build/include 
-fPIC -fvisibility-inlines-hidden
-std=c++11
-Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wno-missing-field-initializers -pedantic -Wno-long-long
-Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment
-g 
-fno-exceptions -fno-rtti
-D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

其中 ~/... 只是我的主目录的路径(出于隐私原因进行编辑;实际输出是完整路径)。我正在开发一个共享系统,需要在本地安装新软件。

教程代码从未明确引用 ABI,因此我认为这一定是某种编译器标志问题。 grep 在非二进制文件中查找缺失的符号会在 include/llvm/Config/abi-breaking.h 中给出一个 extern 声明,并且lib/Support/Error.cpp 中的真实声明:

#if LLVM_ENABLE_ABI_BREAKING_CHECKS
int EnableABIBreakingChecks;
#else
int DisableABIBreakingChecks;
#endif

我想我应该尝试使用-DLLVM_ENABLE_ABI_BREAKING_CHECKS重新编译。这也能起到作用。

我不太清楚 ABI 破坏检查首先在做什么,这可能远远超出了我的 C++ 舒适水平。但是,如果我不需要引用的功能,我该如何消除这个错误?或者修复它,如果我这样做的话?

谢谢。

最佳答案

结果发现答案隐藏在abi-breaking.h中:

/* Allow selectively disabling link-time mismatch checking so that header-only
   ADT content from LLVM can be used without linking libSupport. */
#if !LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING

我不确定以后是否需要 libSupport,但使用 LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1 编译暂时可以。

关于llvm - EnableABIBreakingChecks 编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805007/

相关文章:

c++ - 为什么LLVM选择开放寻址哈希表来实现llvm::StringMap?

c++ - 未优化的 clang++ 代码在普通的 main() 中生成不需要的 "movl $0, -4(%rbp)"

ios - 如果启用了模块,tgmath.h 将不起作用

cmake - 是否可以使用 gold 链接器编译和链接 Clang/LLVM?

c++ - 优化器何时可以组合对成员函数的调用?

llvm - 有没有办法知道在LLVM中使用alloca指令创建的堆栈分配局部变量的堆栈地址

c++ - 带 CMake 的 LLVM 地址 sanitizer

gcc - printf 在使用较旧 gcc 的 x86-64 Linux 上陷入 AL = 10 的无限循环

c++ - 返回空字符串文字 VS。返回 nullptr - 它们是否相同?

c - 位域的可用性