我正在开发LLVM传递并希望通过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。
答案 0 :(得分:0)
问题可能来自多个clang安装。您用来编译插件的clang
版本可能与
clang
不同
clang -Xclang -load -Xclang myPlugin.so ...
如果您使用cmake
来构建插件,那么
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
将生成文件compile_commands.json
,其中将包含您使用的llvm版本。如果您不为插件使用bear make
,则可以选择make -n
或cmake
。
如果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
包含llvm-xxx
中引用的compile_commands.json
。
答案 1 :(得分:0)
我收到该错误是因为传递给RegisterPass的第一个参数与传递本身的名称相同:
static RegisterPass<MyPass> X("MyPass", "DPVariableNamePass", false, false);
更改它可以解决此问题:
static RegisterPass<MyPass> X("my-pass", "DPVariableNamePass", false, false);
也许有帮助