我正在开发一个 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 make
或 make -n
。
如果 compile_commands.json
包含例如
"command": "c++ -c -I/usr/lib/llvm-4.0/include ..."
如果 clang -v
是 clang 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/