我的目標是通過構建本機擴展來安裝couchbase ruby gem,但我看起來像是gem和libcouchbase C之間的架構不匹配圖書館。下面是一些背景:我無法在os上構建couchbase ruby gem x 10.6.8
- 我正在從源代碼構建OS X 10.6.8,使用RVM和Ruby 1.9.2-P320
- 我運行OS X 10.6.7和Xcode的3.2.5了直到昨天,但我無法建立libcouchbase本地
- 我那麼這被稱爲安裝釀造,以幫助緩解libcouchbase安裝和釀造告訴我,我需要至少升級到3.2.6的Xcode
- 我下載的是難以捉摸的Xcode 4.2 for Snow Leopard,因爲它超過了2個小於 Xcode 3.2.6的演出,我想我會得到最新版本。
- Xcode不會安裝,因爲我發現的證書錯誤是系統安裝程序中的錯誤的結果,並且修復程序是升級到OS X 10.6.8,然後應用系統更新
- 幾個小時稍後重新啓動,我正在運行OS X 10.6.8並安裝了XCode 4.2,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-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 -lpthread -ldl -lobjc " checked program was:
/* 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" checked program was:
/* 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: checking for libcouchbase_server_versions() in -lcouchbase... -------------------- 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: ignoring file /usr/local/lib/libcouchbase.dylib, file was built for unsupported file format which is not the architecture being linked (i386) Undefined symbols for architecture i386: "_libcouchbase_server_versions", referenced from: _t in cckhpWpO.o ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status lipo: can't open input file: /var/folders/AT/ATO2AJa-G3Ogm+J4qma1hE+++TI/-Tmp-/mkmf_20120724-40695-16d2a4n/ccAGPue9.out (No such file or directory) checked program was:
/* 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: In function ‘t’: conftest.c:7: error: too few arguments to function ‘libcouchbase_server_versions’ conftest.c: In function ‘t’: conftest.c:7: error: too few arguments to function ‘libcouchbase_server_versions’ lipo: can't figure out the architecture type of: /var/folders/AT/ATO2AJa-G3Ogm+J4qma1hE+++TI/-Tmp-/mkmf_20120724-40695-cblicr/ccG9E6Cp.out checked program was:
/* 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 */
所以,在我看來,問題是,海合會正在尋找/usr/local/lib/libcouchbase.dylib的i386的構建和檢查礦山顯示
/usr/local/lib/libcouchbase.dylib: Mach-O 64-bit dynamically linked shared library x86_64
所以,現在我的問題。這是問題還是紅鯡魚?我是否需要將libcouchbase構建爲i386或通用,或者是寶石方面的問題?我一直在這個系統上構建本地gem擴展多年,沒有問題,包括有時令人討厭的mysql gem,但是現在我已經有了新版本的GCC/Xcode。 rvm發佈說明說,Xcode 4.2只適用於Ruby 1.9.3並打破了很多原生擴展,所以我完全卸載它,然後安裝GCC-10.6.pkg從https://github.com/kennethreitz/osx-gcc-installer/這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設置爲酷睿2。應該是原生而不是?在安裝我最新的osx-gcc工具鏈之後,我通過rvm/JewelryBox從源代碼重建了ruby 1.9.2-p320,以確保它使用相同的標誌。它內置的普及,達爾文和似乎是正確的:
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的開發人員預覽,並且錯誤也是一樣的。我沒有試過的兩件事:
- 安裝XCode 4.1 for Snow Leopard - 即使理論上支持,Apple不再允許下載此文件。
- 雪豹安裝的Xcode 3.2.6 - 我試圖避免4GB的下載,但我剛開始它現在可以嘗試今晚稍後
任何幫助是極大的讚賞,特別是如果你已經建立之前的OS X上的couchbase寶石。
我結束了安裝一個新的紅寶石1.9.3(通過rvm),只建立爲64位。這樣就可以構建64位gem並使用64位libcouchbase。我想我前進,我不能也不應該擔心構建32位寶石/庫。我們將看到。謝謝您的幫助。編輯:我還應該提到,我通過電子郵件向作者發送了關於其他內容的信息,並且他確實做出了迴應並且很有幫助,所以對於所有內容感謝@avsej。 – emkman 2012-08-07 23:45:40