我正在尝试运行使用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 'x' test.cpp
命令运行cppgrep。
假设返回名为x的函数和变量。
要复制错误,在从github存储库下载并解压缩文件后,使用$ docker build -t clang .
命令构建docker容器。然后按照上一段中的1,2,3步骤进行操作。
答案 0 :(得分:1)
经过几天的奋斗,解决了!!
我对错误原因的初步假设是正确的。 clang-llvm环境不适用于cppgrep工具,但我在向cppgrep工具提供环境信息方面犯了错误。
答案有两个步骤:(1)更改Makefile以指向已安装llvm的正确位置,在我的情况下,我将Makefile中的以下行从HEADERS := -isystem /llvm/include/
更改为HEADERS := -isystem /usr/lib/llvm-4.0/include/
。 (2)你必须使用make
命令再次编译文件,只需输入一个空格并在给出命令之前保存cppgrep.cpp文件,否则,你将得到一条消息make: Nothing to be done for 'all'.
就是这样,现在您应该能够通过运行./cppgrep 'x' test.cpp
或./cppgrep -help
来运行cppgrep工具。要使用此docker中的其他工具,例如ast-dump,mccabe等,在使用它们之前必须遵循上述两个步骤。