我的目标是通过构建本机扩展来安装 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 的开发者预览版,报错是一样的。我没有尝试过的两件事:
- 为 Snow Leopard 安装 XCode 4.1 - Apple 不再提供可供下载的文件,即使它在理论上是受支持的。
- 为 Snow Leopard 安装 Xcode 3.2.6 - 我试图避免 4gb 下载,但我现在才开始,今晚晚些时候可以试试
非常感谢任何帮助,特别是如果您以前在 OS X 上构建过 couchbase gem。