/usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1: 找不到版本“LLVM_4.0”

/usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1: version `LLVM_4.0' not found

我正在尝试 运行 一个使用 Clang 和 LLVM 的工具。 docker 提供的工具名称是 cppgrep。请从 github 存储库 - https://github.com/peter-can-talk/cppnow-2017 中找到它。我尝试使用 Ubuntu 16.04 和 17.10,我得到了如下相同的错误:

root@522051d201d2:/home# ./cppgrep -help
./cppgrep: /usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1: version `LLVM_4.0' not found (required by ./cppgrep)
./cppgrep: /usr/lib/x86_64-linux-gnu/libclang-4.0.so.1: version `LLVM_4.0' not found (required by ./cppgrep)
root@522051d201d2:/home#

经过网上搜索,我发现我必须设置环境变量LD_LIBRARY_PATH。因此,作为第一步,我在 docker 中找到了库文件位置,请在下面找到输出:

root@522051d201d2:/home# find / -iname *libclang*.so*
/usr/lib/x86_64-linux-gnu/libclang-4.0.so
/usr/lib/x86_64-linux-gnu/libclang-4.0.so.1
/usr/lib/llvm-4.0/lib/libclang.so.1
/usr/lib/llvm-4.0/lib/libclang-4.0.so
/usr/lib/llvm-4.0/lib/libclang-4.0.0.so
/usr/lib/llvm-4.0/lib/libclang.so
/usr/lib/llvm-4.0/lib/libclang-4.0.so.1
/usr/lib/llvm-4.0/lib/clang/4.0.0/lib/linux/libclang_rt.dyndd-x86_64.so
/usr/lib/llvm-4.0/lib/clang/4.0.0/lib/linux/libclang_rt.asan-i686.so
/usr/lib/llvm-4.0/lib/clang/4.0.0/lib/linux/libclang_rt.asan-x86_64.so
/usr/lib/llvm-4.0/lib/clang/4.0.0/lib/linux/libclang_rt.asan-i386.so

在这一步之后,我设置 LD_LIBRARY_PATH 如下:

root@522051d201d2:/home# echo $LD_LIBRARY_PATH
/usr/lib:/usr/lib/llvm-4.0/lib/:/usr/lib/x86_64-linux-gnu/

最后,我使用命令 export LD_LIBRARY_PATH 导出了它。现在,如果我尝试 运行 cppgrep 工具,我仍然会遇到同样的错误。构建 docker 后测试工具的命令如下: (1) cd进入cppgrep目录,如code/cppgrep, (2)进入docker容器,挂载/home下的文件夹: $ docker run -it -v $PWD:/home clang (3) 运行 cppgrep 使用 ./cppgrep 'x' test.cpp 命令。 它应该是 return 个名称为 x 的函数和变量。

要复制错误,从 github 存储库下载并解压缩文件后,使用 $ docker build -t clang . 命令构建 docker 容器。然后按照上面段落中的1,2,3步骤。

折腾了几天,解决了!!

我对错误原因的初步假设是正确的。 clang-llvm环境对cppgrep工具不可用,但我在向cppgrep工具提供环境信息的方式上犯了错误。

答案有两个步骤:(1) 更改 Makefile 以指向安装 llvm 的正确位置,在我的例子中,我将 Makefile 中的以下行从 HEADERS := -isystem /llvm/include/ 更改为 HEADERS := -isystem /usr/lib/llvm-4.0/include/. (2) 你必须使用make命令再次编译文件,输入一个空的space并在给出命令前保存cppgrep.cpp文件,否则你会得到一个信息作为 make: Nothing to be done for 'all'..

就是这样,现在您应该可以通过 运行 宁 ./cppgrep 'x' test.cpp./cppgrep -help 运行 cppgrep 工具。使用本docker中的其他工具,如ast-dump、mccabe等,使用前必须按照上述两步进行。