我最近安装了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
在非二进制文件中缺失的符号给出了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 ++舒适度水平。但是,如果我不需要引用的功能,该如何使该错误静音?或修复它,如果我这样做了?
谢谢。
答案 0 :(得分:3)
基于llvm irc频道中的讨论。
尝试使用以下命令进行编译:clang ++ -O3 -c $(llvm-config --cxxflags)source_file.cpp -o obj_code。
然后尝试使用以下命令链接:clang ++ obj_code $(llvm-config --ldflags --libs)-lpthread。
我认为万花筒部分没有提到链接部分。上面的解决方案对我有用。
答案 1 :(得分:2)
原来答案被隐藏在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
进行编译。
答案 2 :(得分:0)
使用 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)