0

我的目标是通过构建本机扩展来安装 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 小了 2 gig,我想我会得到最新版本。
  • Xcode 由于证书错误而无法安装,我发现这是系统安装程序中的错误的结果,修复是升级到 OS X 10.6.8,然后应用系统更新
  • 几个小时后重新启动,我正在运行安装了 XCode 4.2 的 OS X 10.6.8,并且 libcouchbase 通过 brew 编译,没有任何问题
  • 我现在尝试安装 couchbase gem,但构建本机扩展失败。它说即使明确传递库的位置也无法找到 libcouchbase
  • 检查 mkmf.log 显示以下内容(添加了粗体强调,但我可能对问题有误!

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 x86_64 -lruby.1.9.1-static -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() ... -------------------- 否

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 x86_64 -lruby.1.9.1-static -lcouchbase -lpthread -ldl -lobjc " ld:警告:忽略文件 /usr/local/lib/libcouchbase.dylib,文件是为不受支持的文件格式构建的,该文件格式不是被链接的体系结构 (i386) 体系结构 i386 的未定义符号:“_libcouchbase_server_versions”,引用自:cckhpWpO 中的 _t .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 */

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 x86_64 -lruby.1.9.1-static -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 并破坏了许多本机扩展,所以我完全卸载了它,然后从https://github.com/kennethreitz/osx-gcc-安装了 GCC-10.6.pkg rvm 推荐的安装程序/,但我仍然有同样的问题。这是我的 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

制造标志:-j2

现在和安装 Xcode 4.2 时,我的 -march 都设置为core2。这应该是原生的吗?在安装最新的 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。

4

2 回答 2

1

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

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

于 2012-08-07T19:49:39.907 回答
1

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

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

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

bundle install
于 2020-08-14T10:39:07.893 回答