【问题标题】:How to compile LLVM against a custom glibc?如何针对自定义 glibc 编译 LLVM?
【发布时间】:2015-08-01 20:28:28
【问题描述】:

我正在使用YouCompleteMe Vim 插件来完成文本(通过Vundle 安装)。 YouCompleteMe 使用 Clang 来完成 C 系列语言(C、C++、Objective-C、Objective-C++)的文本完成。但是,在 YouCompleteMe 更新后(通过 Vim 中的 :VundleUpdate)YouCompleteMe 停止工作。

简而言之,问题是:如何针对自定义 glibc 版本编译 Clang? Debian Wheezy 附带 glibc 2.13,似乎最新的 Clang 版本至少需要 glibc 2.15(解释在下面有更多详细信息)。以防万一,我使用的是 Debian Wheezy、x86-64 和自定义 Linux 内核版本 4.0.0-rc6。

于是我按照LLVM website上的说明从git镜像下载了LLVM:

$ mkdir ~/代码 $ cd ~/code/llvm_source_tree $ git clone http://llvm.org/git/llvm.git $ cd ~/code/llvm_source_tree/llvm/tools $ git clone http://llvm.org/git/clang.git $ cd ~/code/llvm_source_tree/llvm/projects $ git clone http://llvm.org/git/compiler-rt.git $ git clone http://llvm.org/git/test-suite.git $ cd ~/code/llvm_source_tree/llvm $ git config branch.master.rebase true

然后,我按照LLVM website 上的说明编译了 LLVM:

$ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 使-j 5 $苏 # 进行安装

到目前为止一切都很好,所以我通过编译 YouCompleteMe install instructions 之后的 YouCompleteMe 支持库来继续安装 YouCompleteMe:

$ mkdir ~/ycm_build $ cd ~/ycm_build $ cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/usr/local/lib/libclang.so 。 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp $ 制作 ycm_support_libs

然后我运行 Vim,我注意到 YouCompleteMe 似乎仍然无法正常工作。当我在 Vim 中的某个 C++ 文件(例如)中进入编辑模式时,YouCompleteMe 打印错误:The ycmd server SHUT DOWN (restart with :YcmRestartServer). Stderr (last 30 lines):,然后:YcmRestartServer 打印Restarting ycmd server...,然后是('Connection aborted.', error(111, 'Connection refused')))。

:YcmDebugInfo 打印以下内容:

正在打印 YouCompleteMe 调试信息... -- 服务器崩溃,没有来自服务器的调试信息 -- 服务器运行在:http://127.0.0.1:37730 -- 服务器进程 ID:22358 -- 服务器日志文件: -- /tmp/ycm_temp/server_37730_stdout.log -- /tmp/ycm_temp/server_37730_stderr.log

/tmp/ycm_temp/server_37730_stdout.log 为空,但/tmp/ycm_temp/server_37730_stderr.log 包含以下行:

2015-05-20 17:06:46,126 - 调试 - 没有全局额外配置,不调用方法 YcmCorePreload 回溯(最近一次通话最后): _run_module_as_main 中的文件“/usr/lib/python2.7/runpy.py”,第 162 行 "__main__", fname, 加载器, pkg_name) _run_code 中的文件“/usr/lib/python2.7/runpy.py”,第 72 行 run_globals 中的执行代码 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/__main__.py”,第 164 行,在 主要的() 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/__main__.py”,第 150 行,在 Main 从 ycmd 导入处理程序 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/handlers.py”,第 30 行,在 str(e))) RuntimeError:导入 ycm_core 时出错。你确定你已经在文件夹“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd”中放置了3.2+版本的libclang.[so|dll|dylib]?请参阅文档中的安装指南。完全错误:/lib/x86_64-linux-gnu/libc.so.6:找不到版本“GLIBC_2.14”(/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ 需要libclang.so)

所以我运行了 YouCompleteMe 的测试,在运行./vim/bundle/YouCompleteMe/third_party/ycmd/run_tests.sh 时遇到了这个错误:

[ 98%] 构建 CXX 对象 ycm/tests/CMakeFiles/ycm_core_tests.dir/main.cpp.o [100%] 构建 CXX 对象 ycm/tests/CMakeFiles/ycm_core_tests.dir/TestUtils.cpp.o 链接 CXX 可执行文件 ycm_core_tests ../../clang+llvm-3.6.0-x86_64-linux-gnu/lib/libclang.so:未定义对“posix_spawn@GLIBC_2.15”的引用 ../../clang+llvm-3.6.0-x86_64-linux-gnu/lib/libclang.so:未定义对“memcpy@GLIBC_2.14”的引用 collect2:错误:ld 返回 1 个退出状态 make[3]: *** [ycm/tests/ycm_core_tests] 错误 1 make[2]: *** [ycm/tests/CMakeFiles/ycm_core_tests.dir/all] 错误 2 make[1]: *** [ycm/tests/CMakeFiles/ycm_core_tests.dir/rule] 错误 2 make: *** [ycm_core_tests] 错误 2 回溯(最近一次通话最后): 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py”,第 196 行,在 主要的() 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py”,第 189 行,在 Main BuildYcmdLibs(GetCmakeArgs(args)) BuildYcmdLibs 中的文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py”,第 152 行 _err = sys.stderr ) __call__ 中的文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py”,第 1021 行 返回运行命令(cmd,call_args,标准输入,标准输出,标准错误) 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py”,第 486 行,在 __init__ 自我等待() 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py”,第500行,等待 self.handle_command_exit_code(exit_code) 文件“/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py”,第516行,在handle_command_exit_code中 提高 exc(self.ran,self.process.stdout,self.process.stderr) sh.ErrorReturnCode_2: 跑:'/usr/bin/make -j 8 ycm_core_tests' 标准输出: 标准错误:

看来 Clang 3.6.0 可能需要 glibc 2.15 或更高版本。 Debian Wheezy 附带 glibc 2.13。于是决定安装最新的稳定版glibc(目前是2.21)。我之前已经编译了binutils并安装到/usr/local/bin/,所以我现在不需要这样做。

于是我下载了http://ftp.gnu.org/gnu/glibc/glibc-2.21.tar.bz2,然后解压并编译源码并安装:

$ cd ~/代码 $ mkdir ~/code/glibc $ cd ~/code/glibc $ mv -iv ~/downloads/glibc-2.21.tar.bz2 。 $ tar xjvf glibc-2.21.tar.bz2 $ cd glibc-2.21 $ mkdir 构建 $ cd 构建 $ ../configure --with-binutils=/usr/local/bin --prefix=/usr/local/glibc/glibc-2.21 $ 使-j 5 $苏 # 进行安装

然后我重新编译了 LLVM。我将CMAKE_CXX_FLAGS 环境变量中的g++ 链接器标志传递给cmake,遵循Employed Russian 对SO 问题Multiple glibc libraries on a single host 的回答:

$ export CMAKE_CXX_FLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/ld-linux.so.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 使-j 5

然后我重新编译了 YouCompleteMe 支持库,再次将 g++ 链接器标志传递给 cmake in CMAKE_CXX_FLAGS

$ export CMAKE_CXX_FLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/ld-linux.so.2' $ cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/usr/local/lib/libclang.so 。 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp

但是 YouCompleteMe 的问题仍然存在,并且测试仍然以同样的方式失败。也许CMAKE_CXX_FLAGS 不足以将 g++ 链接器标志传递给cmake?在针对 glibc 2.21 编译 LLVM 时,我还尝试使用 LD_LIBRARY_PATH

$ cd ~/code/llvm_source_tree $ mkdir build2 $ cd build2 $ export LD_LIBRARY_PATH="/usr/local/glibc/glibc-2.21/lib:$LD_LIBRARY_PATH" $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/

得到了这个错误:

cmake:加载共享库时出错:__vdso_time:dlopen()的无效模式:无效参数

那我也试了LD_PRELOAD:

$ export LD_PRELOAD='/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2 /usr/local/glibc/glibc-2.21/lib/libc.so.6' $ export LD_LIBRARY_PATH="/usr/local/glibc/glibc-2.21/lib:$LD_LIBRARY_PATH" $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/

得到了这些错误:

-- C 编译器标识未知 -- CXX 编译器标识未知 ld.so 检测到的不一致:dl-minimal.c: 136: realloc: Assertion `ptr == alloc_last_block' 失败!

然后我也尝试将/usr/local/glibc/glibc-2.21/lib/ld-2.21.so添加到export LD_PRELOAD,但它并没有以任何方式改变错误消息。

我很确定 Clang 不需要 glibc 2.15(精确),即使另一个缺失的符号 (posix_spawn@GLIBC_2.15) 最初来自 glibc 2.15,因为 glibc 根据其文档试图保持向后兼容性,无论如何其他缺少符号 (memcpy@GLIBC_2.14) 来自 glibc 2.14。所以我没有用 glibc 2.15 尝试这一切。但现在我没有想法,任何建议都将不胜感激。

编辑 1

我关注了Employed Russian's answer (below),但我的问题没有任何改变。所以我得出结论,export CMAKE_CXX_FLAGS 不是将 g++ 链接器标志传递给cmake 的正确方法。 CMAKE_CXX_FLAGS 是变量 internalcmake 的名称,但 cmake 根本不关心具有相同名称的 环境 变量 (CMAKE_CXX_FLAGS )。 CMAKE_CXX_FLAGS 可以直接在 CMakeLists.txt 中定义,但在 LLVM compiling instructions 中没有使用主 CMakeLists.txt,如果有更实用的选项,我不想从头开始重新创建 LLVM 编译脚本。但我仍然可以找到 3 个其他选项:

  1. cmake 从名为 CXXFLAGS 的环境变量中初始化 CMAKE_CXX_FLAGS。请参阅 sakra 对 SO 问题 Adding include directories to cmake when calling it from command line 的回答。
$ export CXXFLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/ld-linux-x86-64。所以.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 制作
  1. CMAKE_CXX_FLAGS 也可以使用-DCMAKE_CXX_FLAGS 从命令行初始化:
$ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' -DCMAKE_CXX_FLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local/glibc /glibc-2.21/ld-linux-x86-64.so.2' ~/code/llvm_source_tree/llvm/ $ 制作
  1. CMAKE_CXX_FLAGS 也可以使用-DCMAKE_CXX_FLAGS:STRING 从命令行初始化(参见Building mpllibs):
$ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' -DCMAKE_CXX_FLAGS:STRING='-Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local /glibc/glibc-2.21/ld-linux-x86-64.so.2' ~/code/llvm_source_tree/llvm/ $ 制作

所有这 3 个选项产生完全相同的结果:编译 LLVM 以与目标 llvm-tblgenintrinsics_gen 相关的相同错误结束(@987654376 上面产生的 3 个 Makefile 之间的唯一区别@ 命令位于目录名称中,这是由于每个构建都是在不同的目录中完成的)。似乎目标llvm-tblgen 被适当地编译和链接,但之后目标llvm-tblgen 似乎是目标intrinsics_gen 的依赖项,并且不知何故找不到llvm-tblgen。这些是make 输出的最后几行(对于上面的 3 个构建中的每一个都是相同的):

链接 CXX 可执行文件 ../../bin/llvm-tblgen [ 4%] 构建目标 llvm-tblgen 扫描目标 intrinsics_gen 的依赖关系 [ 4%] Building Intrinsics.gen... /bin/sh:1:../../../bin/llvm-tblgen:未找到 make[2]: *** [include/llvm/IR/Intrinsics.gen.tmp] 错误 127 make[1]: *** [include/llvm/IR/CMakeFiles/intrinsics_gen.dir/all] 错误 2 make: *** [全部] 错误 2

我想知道这是否是 LLVM 中的错误,或者设置 cmake 变量 CMAKE_CXX_FLAGS 的方式(在上面的 3 个构建中)是否足够,或者这是由其他原因引起的。任何如何继续的想法将不胜感激。

编辑 2

正如 Employed Russian 在他的评论 (below his answer) 中所建议的那样:

$ export CXXFLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86- 64.so.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 制作

这也导致了与目标llvm-tblgenintrinsics_gen相关的编译错误,但与之前的错误相比,该错误有所不同。这些是make 输出的最后几行:

链接 CXX 可执行文件 ../../bin/llvm-tblgen [ 4%] 构建目标 llvm-tblgen 扫描目标 intrinsics_gen 的依赖关系 [ 4%] Building Intrinsics.gen... ../../../bin/llvm-tblgen:加载共享库时出错:libtinfo.so.5:无法打开共享对象文件:没有这样的文件或目录 make[2]: *** [include/llvm/IR/Intrinsics.gen.tmp] 错误 127 make[1]: *** [include/llvm/IR/CMakeFiles/intrinsics_gen.dir/all] 错误 2 make: *** [全部] 错误 2

所以现在似乎找到了llvm-tblgen,但是加载共享库libtinfo.so.5 时出错。于是我把--rpath=/usr/local/glibc/glibc-2.21改成了--rpath=/usr/local/glibc/glibc-2.21/lib,又试了一次:

$ export CXXFLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux- x86-64.so.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 制作

但是,--rpath 的这种更改根本没有改变make 产生的错误消息。我想知道这个共享库libtinfo.so.5 应该放在哪里。

然后我遇到Building the Clang + LLVM compilers website 并尝试将-std=c++11 添加到CXXFLAGS

$ export CXXFLAGS='-std=c++11 -Wl,--rpath=/usr/local/glibc/glibc-2.21 -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib /ld-linux-x86-64.so.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 制作

但是没有用,报错信息是一样的,就是仍然找不到共享库libtinfo.so.5。也许我的g++ 版本太旧了,它是Debian Wheezy 附带的g++ 4.7.2(g++ --version 打印g++ (Debian 4.7.2-5) 4.7.2)。 Building the Clang + LLVM compilers website 的作者写道,他尝试仅使用 g++ 4.7.1 在 Fedora 15 上构建 LLVM 失败,而最终使用不同的 g++ 版本(4.8、4.8.0、4.7.1)重新启动了几次成功(在网站上描述)。有什么想法吗?

编辑 3

按照 Employed Russian 的建议,我用 -Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu 重新编译了 glibc 2.21:

$ cd ~/code/glibc/glibc-2.21 $ mv -iv 构建 old_build $ mkdir 构建 $ cd 构建 $ export LD_FLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu' $ ../configure --with-binutils=/usr/local/bin --prefix=/usr/local/glibc/glibc-2.21 $ 使-j 5

make check 产生了一些错误:

测试结果总结: 112 失败 2073 通过 第199章 3 XPASS make[1]: *** [测试] 错误 1 make[1]: 离开目录`/home/user/code/glibc/glibc-2.21' make: *** [检查] 错误 2

反正我安装的是新编译的glibc 2.21:

$苏 # 进行安装

make install 产生了这个警告:

/home/user/code/glibc/glibc-2.21/build/elf/ldconfig:警告:忽略无法打开的配置文件:/usr/local/glibc/glibc-2.21/etc/ld.so.conf:没有这个文件或目录 make[1]: 离开目录`/home/user/code/glibc/glibc-2.21'

然后我再次重新编译 LLVM:-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu:

$ export CXXFLAGS='-std=c++11 -Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu -Wl ,--动态链接器=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 制作

但是libstdc++.so.6 不见了:

链接 CXX 可执行文件 ../../bin/llvm-tblgen [ 4%] 构建目标 llvm-tblgen 扫描目标 intrinsics_gen 的依赖关系 [ 4%] Building Intrinsics.gen... ../../../bin/llvm-tblgen:加载共享库时出错:libstdc++.so.6:无法打开共享对象文件:没有这样的文件或目录 make[2]: *** [include/llvm/IR/Intrinsics.gen.tmp] 错误 127 make[1]: *** [include/llvm/IR/CMakeFiles/intrinsics_gen.dir/all] 错误 2 make: *** [全部] 错误 2

所以我得出结论,--rpath 肯定还需要一些其他库目录。

$ 光盘 /usr $ 须藤找到。 -name 'libstdc++.so.6' ./lib32/debug/libstdc++.so.6 ./lib32/libstdc++.so.6 ./lib/x86_64-linux-gnu/debug/libstdc++.so.6 ./lib/x86_64-linux-gnu/libstdc++.so.6 ./lib/git-annex.linux/usr/lib/x86_64-linux-gnu/libstdc++.so.6 ./lib/i386-linux-gnu/libstdc++.so.6

其中,./lib/x86_64-linux-gnu/libstdc++.so.6 看起来最适合我。于是我在--rpath中添加了/usr/lib/x86_64-linux-gnu,并再次重新编译了glibc 2.21:

$ cd ~/code/glibc/glibc-2.21 $ mv -iv 构建 old_build2 $ mkdir 构建 $ cd 构建 $ export LD_FLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux -gnu' $ ../configure --with-binutils=/usr/local/bin --prefix=/usr/local/glibc/glibc-2.21 $ 使-j 5

这次我没有打扰make check,而是直接继续安装:

$苏 # 进行安装

得到了同样看似无害的警告:

/home/user/code/glibc/glibc-2.21/build/elf/ldconfig:警告:忽略无法打开的配置文件:/usr/local/glibc/glibc-2.21/etc/ld.so.conf:没有这个文件或目录 make[1]: 离开目录`/home/user/code/glibc/glibc-2.21'

所以我为 LLVM 添加了 /usr/lib/x86_64-linux-gnu--rpath,并重新编译了 LLVM:

$ export CXXFLAGS='-std=c++11 -Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu:/ usr/lib/x86_64-linux-gnu -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2' $ cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/ $ 制作

构建成功,所以我安装了LLVM:

$苏 # 进行安装

然后我用我用于编译 LLVM 的相同 CXXFLAGS 重新编译了 YouCompleteMe 支持库:

$ export CXXFLAGS='-std=c++11 -Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu:/ usr/lib/x86_64-linux-gnu -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2' $ cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/usr/local/lib/libclang.so 。 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp $ 制作 ycm_support_libs

这个构建也很成功。然后我重新安装了 YouCompleteMe:

$光盘 $ .vim/bundle/YouCompleteMe/install.sh

完成似乎工作。然后我运行了 YouCompleteMe 的测试:

$ .vim/bundle/YouCompleteMe/run_tests.sh

好的,完成仍然有效。

$ .vim/bundle/YouCompleteMe/third_party/ycmd/run_tests.sh

这导致了一个问题。似乎这个.vim/bundle/YouCompleteMe/third_party/ycmd/run_tests.sh 重新编译了支持库——不使用我的Makefile——因此破坏了支持库。解决方案是运行.vim/bundle/YouCompleteMe/third_party/ycmd/run_tests.sh

[100%] 构建 CXX 对象 ycm/tests/CMakeFiles/ycm_core_tests.dir/TestUtils.cpp.o 链接 CXX 可执行文件 ycm_core_tests ../../clang+llvm-3.6.0-x86_64-linux-gnu/lib/libclang.so:未定义对“posix_spawn@GLIBC_2.15”的引用 ../../clang+llvm-3.6.0-x86_64-linux-gnu/lib/libclang.so:未定义对“memcpy@GLIBC_2.14”的引用 collect2:错误:ld 返回 1 个退出状态 make[3]: *** [ycm/tests/ycm_core_tests] 错误 1 make[2]: *** [ycm/tests/CMakeFiles/ycm_core_tests.dir/all] 错误 2 make[1]: *** [ycm/tests/CMakeFiles/ycm_core_tests.dir/rule] 错误 2 make: *** [ycm_core_tests] 错误 2

所以我以最近的方式重新编译了支持库,之后又重新安装了 YouCompleteMe:

$ export CXXFLAGS='-std=c++11 -Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu:/ usr/lib/x86_64-linux-gnu -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2' $ cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/usr/local/lib/libclang.so 。 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp $ 制作 ycm_support_libs $光盘 $ .vim/bundle/YouCompleteMe/install.sh

最后,YouCompleteMe 再次工作!

【问题讨论】:

  • "仍然找不到共享库 libtinfo.so.5" -- 这很可能是安装在/usr/lib/lib中的系统库,或/lib/x86_64-linux-gnu 或 Wheezy 安装它们的任何地方。您的glibc-2.21 版本也可能不在此处。尝试将系统库路径添加到您的 RPATH,如下所示:-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu
  • 这解决了我的问题,非常感谢! /usr/lib/x86_64-linux-gnu 实际上也需要,像这样:-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib:/usr/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu

标签: vim cmake clang llvm glibc


【解决方案1】:

然后我也尝试了LD_PRELOAD

正如here解释的那样,为了使用自定义glibc,您需要设置正确的--dynamic-linker

我看到您正在使用--dynamic-linker=/usr/local/glibc/glibc-2.21/ld-linux.so.2,但这看起来不对:您需要ld-linux-x86-64.so.2

export LD_PRELOAD='/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2 ...

那(ld-linux 的预加载)永远不起作用:首先是 ld-linux 解释 LD_PRELOAD

【讨论】:

  • 请查看我编辑的问题以获取更多信息。
  • @nrz 我想我看到了你的问题:你做了-Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/ld-linux-x86-64.so.2,但你可能想要-Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2(后者推进你尝试的LD_PRELOAD)。在任何情况下,请确保 --dynamic-linker 路径确实存在:您得到的“没有这样的文件”错误表明它不存在。
  • -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2 确实修复了llvm-tblgen 的问题,但现在找不到共享库libtinfo.so.5。请查看我最近的编辑以获取更多信息。
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2014-03-12
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多