c++ - 加载 LLVM 插件时 undefined symbol

标签 c++ llvm llvm-clang abi

我正在开发一个 LLVM pass,并希望通过 Clang LLVM 驱动程序将其作为插件运行:

clang -Xclang -load -Xclang myPlugin.so ...

一开始我遇到了类似这里描述的错误

按照建议应用标志 -D_GLIBCXX_USE_CXX11_ABI=0 后,出现此错误:

error: unable to load plugin 'myPlugin.so': 'myPlugin.so: undefined symbol: _ZNK4llvm12FunctionPass17createPrinterPassERNS_11raw_ostreamERKSs

此页面表明可能存在 ABI 兼容性问题(我不完全理解)

我的目标是使用 GCC 或 Clang 编译传递并使用系统 Clang 安装(Ubuntu 16.04、LLVM 3.8)运行它,而不是从源代码构建 Clang/LLVM。

最佳答案

问题可能来自多个 clang 安装。您用于编译插件的 clang 版本可能与在

中调用的 clang 不同
clang -Xclang -load -Xclang myPlugin.so ...

如果您使用cmake 构建您的插件,那么

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

将生成文件 compile_commands.json,其中将包含您使用的 llvm 版本。如果您的插件不使用 cmake,则可以使用 bear makemake -n

如果 compile_commands.json 包含例如

"command": "c++ -c -I/usr/lib/llvm-4.0/include ..."

如果 clang -vclang version 3.8.0,您可能会收到此错误消息,尤其是 llvm::FunctionPass::createPrinterPass 在 llvm-4.0 中而不在 llvm-3.8 中。

一个解决方案可能是编译

clang-xxx -Xclang -load -Xclang myPlugin.so ...

其中 clang-xxx 包含 compile_commands.json 中引用的 llvm-xxx

关于c++ - 加载 LLVM 插件时 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43745850/

相关文章:

c++ - 基类 C++14 模板函数在 Mac OS 上的 clang 中不可见(递归模板)

c++ - 在 C C++ 中比较和匹配 word/excel 文件中的数字

c++ - vector<int*>.push_back() 正在覆盖 front() 指向的值

llvm - 使用 LLVM 工具链编译、组装和反汇编

c++ - 使用 Makefiles 在 Eclipse CDT 中进行错误检查

c++ - 了解 clang 循环优化

c++ - CXXRecords getNameAsString,如何获取全名?

C++ : How to pass function pointer, 存储在局部变量中,作为模板参数

c++ - 我如何编写用于字符串的双哈希实现?

llvm - 如何为Mac安装LLVM?