首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在EnableABIBreakingChecks上编译失败

在EnableABIBreakingChecks上编译失败
EN

Stack Overflow用户
提问于 2018-12-17 02:01:12
回答 4查看 2.4K关注 0票数 7

我最近安装了LLVMv8.0.0(在RHEL 7.4上)。我正在通过LLVM Kaleidoscope tutorial学习如何使用系统,但我遇到了一个链接问题。

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

代码语言:javascript
运行
复制
clang++ -g -O3 kld.cpp `llvm-config --cxxflags` -o kld

它可以编译,但链接器在以下位置失败:

代码语言:javascript
运行
复制
/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给予(重新格式化以提高可读性)

代码语言:javascript
运行
复制
-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,所以我认为这一定是某种编译器标志问题。对于非二进制文件中缺少的符号,greping在include/llvm/Config/abi-breaking.h中给出了extern声明,在lib/Support/Error.cpp中给出了实际声明

代码语言:javascript
运行
复制
#if LLVM_ENABLE_ABI_BREAKING_CHECKS
int EnableABIBreakingChecks;
#else
int DisableABIBreakingChecks;
#endif

我想我应该尝试用-DLLVM_ENABLE_ABI_BREAKING_CHECKS重新编译。这也可以做到这一点。

我真的不清楚ABI破坏检查是怎么回事,这可能超出了我的C++舒适度。但是,如果我不需要引用的功能,我如何消除这个错误;或者,如果我需要,如何修复它?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2018-12-18 07:18:18

原来答案隐藏在abi-breaking.h

代码语言:javascript
运行
复制
/* 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
EN

Stack Overflow用户

发布于 2019-01-01 04:02:18

基于在llvm信道中的讨论。

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

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

我想链接部分在万花筒部分没有提到。上面的解决方案对我很有效。

票数 4
EN

Stack Overflow用户

发布于 2020-08-20 14:22:14

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

使用此CMake代码片段:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53805007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档