EnableABIBreakingChecks 编译失败

问题描述 投票:0回答:5

我最近安装了 LLVM v8.0.0(在 RHEL 7.4 上)。我正在通过 LLVM Kaleidoscopy 教程 来学习如何使用该系统,但遇到了链接问题。

根据教程(第 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
查找非二进制文件中缺失的符号会在
extern
中给出
include/llvm/Config/abi-breaking.h
声明,并在
lib/Support/Error.cpp
中给出真正的声明:

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

我想我会尝试用

-DLLVM_ENABLE_ABI_BREAKING_CHECKS
重新编译。这也能起到作用。

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

谢谢。

llvm llvm-clang abi llvm-c++-api
5个回答
7
投票

原来答案隐藏在

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
编译暂时有效。


5
投票

基于 llvm irc 频道的讨论。

尝试使用以下命令进行编译:clang++ -O3 -c $(llvm-config --cxxflags) source_file.cpp -o obj_code。

然后尝试使用以下命令链接:clang++ obj_code $(llvm-config --ldflags --libs) -lpthread。

我认为万花筒部分没有提到链接部分。上述解决方案对我有用。


5
投票

添加与 LLVMSupport 库的链接也将解决这个问题。

使用此 CMake 片段:

find_package(LLVM REQUIRED CONFIG)

message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

add_executable(main main.cpp)
target_link_libraries(main LLVMSupport)

2
投票

我不知道它的影响和原理。但是当我添加 -DLLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING 时,错误消失了。

clang++ xxx -DLLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING

参考: https://www.coder.work/article/6278120
https://blog.csdn.net/qq_37887537/article/details/112790961


0
投票

这些答案都太复杂了。将

llvm-config --cxxflags
替换为
llvm-config --cxxflags --libs
,它应该可以正常运行(正确地,而不是使用您的解决方案使用的眼不见心不烦的心态)。

© www.soinside.com 2019 - 2024. All rights reserved.