我的目标是通过构建本机扩展来安装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个以上,我想我会得到最新版本 .
-
由于证书错误导致Xcode无法安装,我发现这是由系统安装程序中的错误导致的,修复程序是升级到OS X 10.6.8然后应用系统更新
-
几个小时后重新启动,我运行OS X 10.6.8并安装了XCode 4.2并通过brew编译libcouchbase而没有任何打嗝
-
我现在尝试安装couchbase gem,但构建本机扩展失败 . 它表示即使显式传递库的位置也无法找到libcouchbase
-
检查mkmf.log显示以下内容( bold emphasis added, but I may be wrong about the problem!
“/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-parentheses - 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 x86_64 -lr uby.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-parentheses -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()... -------------------- no“/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-parentheses -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 x86_64 -lruby.1.9.1-static -lcouchbase -lpthread -ldl -lobjc“ld:warning:忽略文件/ usr / local / lib / libcouchbase.dylib,文件是为不支持的文件格式而构建的,它不是被链接的体系结构(i386)体系结构i386的未定义符号:“_ libcouchbase_server_versions”,引自:_t in cckhpWpO.o ld:symbol(s)not found for architecture 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-parentheses -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 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'的参数太少:无法弄清楚架构类型:/ 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-installer/安装了GCC-10.6.pkg,rvm推荐它作为工作,但我仍然有相同的问题 . 这是我的brew --env转储:
CC:/ 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 . 这应该是原生的吗?我在安装了我最新的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,Apple也不再提供此文件供下载 .
-
为Snow Leopard安装Xcode 3.2.6 - 我试图避免4gb下载,但我现在刚刚启动它,可以在今晚稍后尝试
非常感谢任何帮助,特别是如果您之前在OS X上构建了couchbase gem .
1 回答
我认为这是一个很好的问题,因为我记得经历了一些类似的尝试自己构建宝石的痛苦 . 然而,那是一段时间以前我没有文件等方便记住我做了什么或我的错误看起来像你的 .
我知道它不如直接回答那么好,但我认为你应该能够在这里与宝石作者联系:https://groups.google.com/forum/#!forum/couchbase或通过推特上的@avsej .