我最近安装了 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/