【问题标题】:I am unable to build the couchbase ruby gem on os x 10.6.8我无法在 os x 10.6.8 上构建 couchbase ruby​​ gem
【发布时间】:2012-07-24 19:37:53
【问题描述】:

我的目标是通过构建本机扩展来安装 couchbase ruby​​ gem,但我发现 gem 和 libcouchbase C 库之间的架构不匹配。这是一些背景:

  • 我正在运行 OS X 10.6.8,使用 rvm 和从源代码构建的 ruby​​ 1.9.2-p320
  • 直到昨天我还在运行 OS X 10.6.7 和 Xcode 3.2.5,但我无法在本地构建 libcouchbase
  • 然后我安装了众所周知的 brew,它有助于简化 libcouchbase 的安装,并且 brew 告诉我我需要至少升级到 Xcode 3.2.6
  • 我为 Snow Leopard 下载了难以捉摸的 Xcode 4.2,因为它比 Xcode 3.2.6,我想我会得到最新版本。
  • Xcode 由于证书错误而无法安装,我发现这是系统安装程序中的错误导致的,修复方法是升级到 OS X 10.6.8,然后应用系统更新
  • 几个小时后重新启动,我正在运行安装了 XCode 4.2 的 OS X 10.6.8,并且 libcouchbase 通过 brew 编译,没有任何问题
  • 我现在尝试安装 couchbase gem,但构建原生扩展失败。它说即使明确传递库的位置也无法找到 libcouchbase
  • 检查 mkmf.log 显示以下内容(添加了粗体强调,但我可能对问题有误!

"/usr/bin/gcc-4.2 -o conftest -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/universal-darwin10.8.0 -I /Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/ruby/backward -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include /ruby-1.9.1 -I. -I/usr/local/Cellar/libevent/2.0.19/include -I/opt/local/include -I/usr/local/include -I/Users/emkman/.rvm /rubies/ruby-1.9.2-p320/include -I/usr/include -I/Users/emkman/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-括号 -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long -arch i386 -arch x86_64 -fno-common -pipe -std=c99 -Wall - Wextra conftest.c -L.-L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/local/Cellar/libevent/2.0.19/lib -L/opt/local /lib -L/usr/local/lib -L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/lib -L/Users/emkman/.rvm/usr/lib -L. -arch i386 -arch x86_64 -L/usr/local/lib -arch i386 -arch x 86_64 -lruby.1.9.1-静态-lpthread -ldl -lobjc“ 检查的程序是:

/* begin */
1: #include "ruby.h"
2: 
3: int main() {return 0;}
/* end */

"/usr/bin/gcc-4.2 -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/universal-darwin10.8.0 -I/Users/ emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/ruby/backward -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby- 1.9.1 -I. -I/usr/local/Cellar/libevent/2.0.19/include -I/opt/local/include -I/usr/local/include -I/Users/emkman/.rvm/rubies/ ruby-1.9.2-p320/include -I/usr/include -I/Users/emkman/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-括号 -Wpointer -arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long -arch i386 -arch x86_64 -fno-common -pipe -std=c99 -Wall -Wextra -arch i386 -arch x86_64 -c conftest.c" 检查的程序是:

/* begin */
 1: #include "ruby.h"
 2: 
 3:   #include <stdarg.h>
 4:   int foo(int x, ...) {
 5:     va_list va;
 6:     va_start(va, x);
 7:     va_arg(va, int);
 8:     va_arg(va, char *);
 9:     va_arg(va, double);
10:     return 0;
11:   }
12:   int main() {
13:     return foo(10, "", 3.14);
14:     return 0;
15:   }
/* end */

have_library:检查 -lcouchbase 中的 libcouchbase_server_versions()...-------- 否

"/usr/bin/gcc-4.2 -o conftest -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/universal-darwin10.8.0 -I /Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/ruby/backward -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include /ruby-1.9.1 -I. -I/usr/local/Cellar/libevent/2.0.19/include -I/opt/local/include -I/usr/local/include -I/Users/emkman/.rvm /rubies/ruby-1.9.2-p320/include -I/usr/include -I/Users/emkman/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-括号 -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long -arch i386 -arch x86_64 -fno-common -pipe -std=c99 -Wall - Wextra conftest.c -L.-L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/local/Cellar/libevent/2.0.19/lib -L/opt/local /lib -L/usr/local/lib -L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/lib -L/Users/emkman/.rvm/usr/lib -L. -arch i386 -arch x86_64 -L/usr/local/lib -arch i386 -arch x 86_64 -lruby.1.9.1-静态 -lcouchbase -lpthread -ldl -lobjc " ld:警告:忽略文件 /usr/local/lib/libcouchbase.dylib,文件是为不受支持的文件格式构建的,该文件格式不是所链接的体系结构 (i386) 架构 i386 的未定义符号: “_libcouchbase_server_versions”,引用自: _t 在 cckhpWpO.o ld:未找到架构 i386 的符号 collect2: ld 返回 1 个退出状态 lipo:无法打开输入文件:/var/folders/AT/ATO2AJa-G3Ogm+J4qma1hE+++TI/-Tmp-/mkmf_20120724-40695-16d2a4n/ccAGPue9.out(没有这样的文件或目录) 检查的程序是:

/* begin */
1: #include "ruby.h"
2: 
3: #include <libcouchbase/couchbase.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { void ((*volatile p)()); p = (void ((*)()))libcouchbase_server_versions; return 0; }
/* end */

"/usr/bin/gcc-4.2 -o conftest -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/universal-darwin10.8.0 -I /Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include/ruby-1.9.1/ruby/backward -I/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/include /ruby-1.9.1 -I. -I/usr/local/Cellar/libevent/2.0.19/include -I/opt/local/include -I/usr/local/include -I/Users/emkman/.rvm /rubies/ruby-1.9.2-p320/include -I/usr/include -I/Users/emkman/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-括号 -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long -arch i386 -arch x86_64 -fno-common -pipe -std=c99 -Wall - Wextra conftest.c -L.-L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/local/Cellar/libevent/2.0.19/lib -L/opt/local /lib -L/usr/local/lib -L/Users/emkman/.rvm/rubies/ruby-1.9.2-p320/lib -L/usr/lib -L/Users/emkman/.rvm/usr/lib -L. -arch i386 -arch x86_64 -L/usr/local/lib -arch i386 -arch x 86_64 -lruby.1.9.1-静态 -lcouchbase -lpthread -ldl -lobjc " conftest.c:在函数“t”中: conftest.c:7:错误:函数“libcouchbase_server_versions”的参数太少 conftest.c:在函数“t”中: conftest.c:7:错误:函数“libcouchbase_server_versions”的参数太少 lipo:无法确定以下架构类型:/var/folders/AT/ATO2AJa-G3Ogm+J4qma1hE+++TI/-Tmp-/mkmf_20120724-40695-cblicr/ccG9E6Cp.out 检查的程序是:

/* begin */
1: #include "ruby.h"
2: 
3: #include <libcouchbase/couchbase.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { libcouchbase_server_versions(); return 0; }
/* end */

所以在我看来,问题在于 gcc 正在寻找 /usr/local/lib/libcouchbase.dylib 的 i386 版本并检查我的节目

/usr/local/lib/libcouchbase.dylib:Mach-O 64位动态链接共享库x86_64

现在回答我的问题。这是问题还是红鲱鱼?我是否需要将 libcouchbase 构建为 i386 或通用,还是 gem 方面的问题?多年来,我一直在这个系统上构建原生 gem 扩展而没有问题,包括有时令人讨厌的 mysql gem,但现在我有了新版本的 GCC/Xcode。 rvm 发行说明说 Xcode 4.2 仅适用于 Ruby 1.9.3 并且破坏了许多本机扩展,所以我完全卸载了它,然后从 rvm 推荐的 https://github.com/kennethreitz/osx-gcc-installer/ 安装了 GCC-10.6.pkg 作为工作,但我仍然有同样的问题。这是我的 brew --env 转储:

抄送:/usr/bin/llvm-gcc => /usr/llvm-gcc-4.2/bin/llvm-gcc-4.2

CXX: /usr/bin/llvm-g++ => /usr/llvm-gcc-4.2/bin/llvm-g++-4.2

LD: /usr/bin/llvm-gcc => /usr/llvm-gcc-4.2/bin/llvm-gcc-4.2

CFLAGS:-Os -w -pipe -march=core2 -msse4.1 -mmacosx-version-min=10.6

CXXFLAGS:-Os -w -pipe -march=core2 -msse4.1 -mmacosx-version-min=10.6

CPPFLAGS:-isystem /usr/local/include

LDFLAGS:-L/usr/local/lib

MACOSX_DEPLOYMENT_TARGET:10.6

MAKEFLAGS:-j2

现在和安装 Xcode 4.2 时,我的 -march 都设置为 core2。这应该是 native 吗?在安装最新的 osx-gcc 工具链后,我通过 rvm/JewelryBox 从源代码重建了 ruby​​ 1.9.2-p320,以确保它使用相同的标志。它是作为universal-darwin 构建的,看起来是正确的:

interpreter:  "ruby"
version:      "1.9.2p320"
date:         "2012-04-20"
platform:     "universal.x86_64-darwin10.8.0"
patchlevel:   "2012-04-20 revision 35421"
full_version: "ruby 1.9.2p320 (2012-04-20 revision 35421) [universal.x86_64-darwin10.8.0]"

我知道这是很多信息,但我只想彻底了解细节并表明我已经尝试了几乎所有方法。还要提一下,我试过 gem 的开发者预览版结合 libcouchbase 的开发者预览版,报错是一样的。我没有尝试过的两件事:

  1. 为 Snow Leopard 安装 XCode 4.1 - Apple 不再提供可供下载的文件,即使理论上支持。
  2. 为 Snow Leopard 安装 Xcode 3.2.6 - 我试图避免 4gb 下载,但我现在才开始,今晚晚些时候可以试试

非常感谢任何帮助,尤其是如果您之前在 OS X 上构建过 couchbase gem。

【问题讨论】:

    标签: ruby xcode gcc osx-snow-leopard couchbase


    【解决方案1】:

    我认为这是一个很好的问题,因为我记得自己在尝试构建 gem 时经历了一些类似的痛苦。不过那是不久前的事了,我没有方便的文件等来记住我做了什么,或者我的错误看起来像你的错误。

    我知道这不如直接回答,但我认为您应该可以在此处与 gem 的作者取得联系:https://groups.google.com/forum/#!forum/couchbase 或通过 Twitter 上的@avsej。

    【讨论】:

    • 我最终安装了一个仅构建为 64 位的新 ruby​​ 1.9.3(通过 rvm)。这样就能够构建 64 位 gem 并使用 64 位 libcouchbase。我想我不能也真的不需要担心构建 32 位 gems/libraries。我们会看到的。谢谢您的帮助。编辑:我还应该提到,我通过电子邮件向作者发送了其他内容,他确实回复了并且很有帮助,所以也感谢@avsej 所做的一切。
    【解决方案2】:

    尝试以下步骤,这解决了我的问题:

    brew unlink libcouchbase
    brew install libcouchbase@2
    brew link --force --overwrite libcouchbase@2
    brew update && brew upgrade
    

    然后尝试捆绑安装或 gem 安装。

    bundle install
    

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多