【问题标题】:How to fix undefined reference LLVM error while linking CXX executable如何在链接 CXX 可执行文件时修复未定义的引用 LLVM 错误
【发布时间】:2023-03-20 14:26:01
【问题描述】:

我试图从以下位置构建 llvm-slicer:

https://github.com/IAIK/ios-analysis-llvmslicer

我按照说明进行操作:

cd llvm-slicer
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="AArch64;X86" -DLLVM_ENABLE_EH=YES -DLLVM_ENABLE_RTTI=ON ..
make -j4 opt
make -j4 llvm-slicer

但是当我执行最后一条命令make -j4 llvm-slicer时,出现错误:

[100%] Built target LLVMAnalysis
[100%] Linking CXX executable ../../bin/llvm-slicer
/usr/bin/ld: ../../lib/libLLVMSlicer.a(FunctionStaticSlicer.cpp.o): in function `llvm::Pass* llvm::callDefaultCtor<(anonymous namespace)::FunctionSlicer>()':
FunctionStaticSlicer.cpp:(.text._ZN4llvm15callDefaultCtorIN12_GLOBAL__N_114FunctionSlicerEEEPNS_4PassEv+0x1c): undefined reference to `vtable for (anonymous namespace)::FunctionSlicer'
collect2: error: ld returned 1 exit status
make[3]: *** [tools/llvm-slicer/CMakeFiles/llvm-slicer.dir/build.make:116: bin/llvm-slicer] Error 1
make[2]: *** [CMakeFiles/Makefile2:9647: tools/llvm-slicer/CMakeFiles/llvm-slicer.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:9654: tools/llvm-slicer/CMakeFiles/llvm-slicer.dir/rule] Error 2
make: *** [Makefile:2740: llvm-slicer] Error 2

我不知道如何解决它,我在谷歌上找不到任何类似的问题,希望有人能帮助我解决这个问题,非常感谢。

【问题讨论】:

  • 可能是并行问题?放弃-j4 选项,从头开始检验这个假设。

标签: makefile cmake clang llvm


【解决方案1】:

这个问题可能有几种情况,但在我看来,这里的情况是给定信息,您的默认编译器(_ZN...something 错误主要是因为编译器或链接器)是早期版本的 gnu(gcc for c , g++ for c++) 在您的主机 pc(或者可能是 clang 以外的其他编译器)中,并且正在努力解决 c++ 功能anonymous namespace,因为,给定错误的一部分说:

/usr/bin/ld: ../../lib/libLLVMSlicer.a(FunctionStaticSlicer.cpp.o): in function `llvm::Pass* llvm::callDefaultCtor<(anonymous namespace)::FunctionSlicer>()':
FunctionStaticSlicer.cpp:(.text._ZN4llvm15callDefaultCtorIN12_GLOBAL__N_114FunctionSlicerEEEPNS_4PassEv+0x1c): undefined reference to `vtable for (anonymous namespace)::FunctionSlicer'

为此,您可以做几件事:

1-) 您可以更改编译器以进行构建。在命令窗口中,您可以将clangclang++ 导出为您的编译器在cmake 配置之前。在这里,我假设您从任何地方安装了新版本的 clang 编译器,甚至是 github 克隆,我可以在这里举几个示例如何导出,您可以轻松地将其中一个适应您的情况:

export CC=clang
export CXX=clang++

另一个版本:

export CC=clang-11
export CXX=clang++-11

另一个版本:

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++

另一个版本:

export CC=/usr/bin/clang-12
export CXX=/usr/bin/clang++-12

另一个 github 克隆版本:

export CC=~/llvm/llvm-project/build/bin/clang
export CXX=~/llvm/llvm-project/build/bin/clang++

即使这不会更改您的编译器,您也可以在使用 cmake 配置时通过 -DCMAKE_C_COMPILER={your-c-compiler}-DCMAKE_CXX_COMPILER={your-c++-compiler} cmake 标志更改编译器。尝试使用gccclang。以下是您的示例配置:

cmake \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_BUILD_TYPE="Release" \
-DLLVM_TARGETS_TO_BUILD="AArch64;X86" \
-DLLVM_ENABLE_EH=YES \
-DLLVM_ENABLE_RTTI=ON ..

2-) 错误可能是由于 c++ 标准,您可以添加 -DCMAKE_CXX_STANDARD=14(LLVM 使用的默认 C++ 标准)标志作为 cmake 配置,如:

cmake -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="AArch64;X86" -DLLVM_ENABLE_EH=YES -DLLVM_ENABLE_RTTI=ON -DCMAKE_CXX_STANDARD=14 ..

3-) 即使在上述情况下不起作用,您也可以从FunctionStaticSlicer.cpp 文件中删除匿名命名空间(在错误消息中给出)并尝试重新构建。你可以像这样找到这些行:

// some code here and do not delete

namespace { // delete this line 
// as you can see there is no name of namespace that's why called 'anonymous'
// if it was it would be like 'namespace nmspcName {'

// some code here and do not delete

} // and delete this line, too

// some code here and do not delete

但这是非常糟糕的做法,即使它可以解决您的问题,我也不推荐。

您也可以尝试在CMakeLists.txt 文件中进行类似的更改或添加其他 cmake 配置标志,但是在我看来,您可以通过 1. 更改默认编译器的选项轻松解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2018-05-14
    • 2022-06-13
    • 2021-11-05
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多