EnableABIBreakingChecks 上的编译失败

bau*_*aum 6 abi llvm llvm-clang llvm-c++-api

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

根据教程(第 2 章结尾),我运行:

clang++ -g -O3 kld.cpp `llvm-config --cxxflags` -o kld
Run Code Online (Sandbox Code Playgroud)

它编译,但链接器失败:

/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)
Run Code Online (Sandbox Code Playgroud)

我怀疑这可能是 的问题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
Run Code Online (Sandbox Code Playgroud)

哪里~/...只是我的主目录的路径(为隐私而编辑;实际输出是完整路径)。我正在开发一个需要在本地安装新软件的共享系统。

教程代码从未明确引用 ABI,所以我认为这一定是某种编译器标志问题。grep对非二进制文件中缺少的符号进行 ing 给出了extern声明 ininclude/llvm/Config/abi-breaking.h和真正的声明 in lib/Support/Error.cpp

#if LLVM_ENABLE_ABI_BREAKING_CHECKS
int EnableABIBreakingChecks;
#else
int DisableABIBreakingChecks;
#endif
Run Code Online (Sandbox Code Playgroud)

我想我会尝试重新编译,然后,使用-DLLVM_ENABLE_ABI_BREAKING_CHECKS. 这也能起作用。

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

谢谢。

bau*_*aum 5

原来答案隐藏在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
Run Code Online (Sandbox Code Playgroud)

我不确定我是否需要 libSupport,但LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1目前正在编译。


Pre*_*kie 5

基于 llvm irc 频道中的讨论。

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

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

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


pre*_*uin 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)
Run Code Online (Sandbox Code Playgroud)