在 OSX 上使用 rbenv 和 Command-T 构建 Vim

在 OSX 上使用 rbenv 和 Command-T 构建 Vim

dyld:惰性符号绑定失败:未找到符号:_rb_encdb_declare 引用自:/Users/sa125/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin10.8.0/enc/encdb.bundle 预期位于:平面命名空间

dyld:未找到符号:_rb_encdb_declare 引用自:/Users/sa125/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin10.8.0/enc/encdb.bundle 预期位于:flat namespace Vim:捕获致命信号 SEGV

你好,

我已经在 MacbookPro(运行 OSX 10.6.8)上构建了 vim,并尝试让 Command-T 工作。我的系统上的 ruby​​ 由 RBENV 提供,我使用以下简单脚本来构建和安装 vim:

#!/bin/bash

make distclean

./configure --with-features=huge \
            --enable-rubyinterp=yes \
            --with-ruby-command=`rbenv which ruby` \
            --enable-pythoninterp \
            --enable-perlinterp \
            --enable-cscope=yes \

make
make install

Vim 编译成功,除 Command-T 外,其他一切都正常。我通过克隆 repo 并rake make && make在根文件夹内运行重新安装了 Command-T,同时确保使用相同的 ruby​​ 版本 (1.9.3-p194) 来编译 vim 和 Command-T。当我运行 vim 并加载 Command-T 时,它崩溃并出现以下错误:

dyld: lazy symbol binding failed: Symbol not found: _rb_encdb_declare
Referenced from: /Users/sa125/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin10.8.0/enc/encdb.bundle
Expected in: flat namespace

dyld: Symbol not found: _rb_encdb_declare
Referenced from: /Users/sa125/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin10.8.0/enc/encdb.bundle
Expected in: flat namespace

Vim: Caught deadly signal SEGV

我尝试使用不同的 ruby​​ 版本 (1.9.2-p320) 构建两者,但结果相同。如果其他方法都失败了,我会使用CtrlP(这也很好),但我想再试一次,至少找出导致问题的原因,所以任何想法都会有所帮助。谢谢。

答案1

我写了一个博客文章关于我遇到同样问题的经历,但简而言之,我认为你需要申请此补丁到您的 Ruby 构建,然后使用指定的 Ruby 构建 Vim。构建 Command-T 时,请确保使用相同的 Ruby 解释器。

以下是为方便 Google 员工使用的补丁:

diff --git a/missing/setproctitle.c b/missing/setproctitle.c
index 169ba8b..4dc6d03 100644
--- a/missing/setproctitle.c
+++ b/missing/setproctitle.c
@@ -48,6 +48,12 @@
 #endif
 #include <string.h>

+#if defined(__APPLE__)
+#include <crt_externs.h>
+#undef environ
+#define environ (*_NSGetEnviron())
+#endif
+
 #define SPT_NONE   0   /* don't use it at all */
 #define SPT_PSTAT  1   /* use pstat(PSTAT_SETCMD, ...) */
 #define SPT_REUSEARGV  2   /* cover argv with title information */

再次,如果它对其他人有帮助,这是一个ruby-build我用来自动添加此补丁和猎鹰补丁的公式:

build_package_combined_patch() {
  local package_name="$1"

  {
    curl https://raw.github.com/gist/3905045/bf9d1c84c72cdce5be52d8b2dfd4d86a1cdbf185/gistfile1.txt | git apply
    curl https://raw.github.com/wayneeseguin/rvm/master/patches/ruby/1.9.3/p286/falcon.diff | git apply
    autoconf
    ./configure --prefix="$PREFIX_PATH" $CONFIGURE_OPTS --enable-shared
    make -j 8
    make install
  } >&4 2>&1

}

require_gcc

install_package "yaml-0.1.4" "http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz"
install_package "ruby-1.9.3-p286" "http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p286.tar.gz" combined_patch

编辑于 2013 年 8 月 31 日:Ruby 的当前版本不再需要此补丁(Ruby 默认已安装此补丁)。但是,仍有一件事可能出错。您必须确保 Ruby 是作为共享库构建的。如果 Vim 以同样的方式崩溃,则可能与此问题有关。请确保添加您的配置选项 include --enable-shared。(请参阅此错误报告以供进一步讨论。

答案2

您可以绕过 rbenv 并在配置 Vim 时使用系统 Ruby:

./configure --with-ruby-command=/usr/bin/ruby

以及设置 Command-T 时:

/usr/bin/ruby extconf.rb && make

相关内容