2013-11-15 10 views
5

के साथ लिंकर त्रुटियां मिलती हैं, इसलिए, मैंने मैवरिक्स के साथ-साथ एक्सकोड (5.02) के नवीनतम संस्करण में अपग्रेड किया, और - जैसा कि अपेक्षित था, किसी भी नए रूबी रत्न को संकलित करने में असमर्थ था सी एक्सटेंशन। यह विशेष रूप से मेरे स्वयं के प्रोजेक्ट, एनमैट्रिक्स के साथ होता है, जिसमें सी और सी ++ कोड शामिल होता है।हर बार जब मैं एक्सकोड को अपग्रेड करता हूं, तो मुझे ब्रॉड स्थापित जीसीसी

मैंने एक्सकोड के लिए कमांड लाइन टूल्स को पुनर्स्थापित किया। तब मैंने होमब्री को अपग्रेड किया। फिर मैंने rbenv, ruby-build, और मेरे कस्टम जीसीसी संस्करणों को अनइंस्टॉल किया (4.7 को छोड़कर, जिसे ब्रू के माध्यम से मैन्युअल रूप से इंस्टॉल किया गया था)।

अगला, मैंने gcc48 (और gcc49 को अच्छी माप के लिए) स्थापित करने के लिए ब्रू का उपयोग किया। मैंने अपने मणि को जीसीसी 4.9 के देव स्नैपशॉट की बजाय जीसीसी -4.8.2 के साथ निर्माण करने का निर्देश दिया।

अच्छी खबर यह है कि मेरा मणि अब ठीक से संकलित करता है। बुरी खबर यह है कि यह लिंक नहीं होगा। यहां केवल लिंकिंग चरण है:

$ bundle exec rake compile 
cd tmp/x86_64-darwin13.0.0/nmatrix/2.0.0 
make 
linking shared-object nmatrix.bundle 
ld: warning: directory not found for option '-L/usr/lib64/atlas' 
0 0x10ef3f724 __assert_rtn + 144 
1 0x10ef7425e archive::File<x86_64>::makeObjectFileForMember(archive::File<x86_64>::Entry const*) const + 1118 
2 0x10ef73c3b archive::File<x86_64>::justInTimeforEachAtom(char const*, ld::File::AtomHandler&) const + 139 
3 0x10ef883fe ld::tool::InputFiles::searchLibraries(char const*, bool, bool, bool, ld::File::AtomHandler&) const + 210 
4 0x10ef8f181 ld::tool::Resolver::resolveUndefines() + 189 
5 0x10ef911a5 ld::tool::Resolver::resolve() + 79 
6 0x10ef3fb17 main + 669 
A linker snapshot was created at: 
    /tmp/nmatrix.bundle-2013-10-15-085036.ld-snapshot 
ld: Assertion failed: (memberIndex != 0), function makeObjectFileForMember, file /SourceCache/ld64/ld64-224.1/src/ld/parsers/archive_file.cpp, line 355. 
collect2: error: ld returned 1 exit status 
make: *** [nmatrix.bundle] Error 1 
rake aborted! 
Command failed with status (2): [make...] 

यह दो कारणों से अजीब है।

  1. यह एक स्पोरैडिक त्रुटि है। हमने इसे दो बार देखा है और यह हमेशा अस्पष्ट कारणों से दूर जाना प्रतीत होता है।

  2. मुझे नहीं लगता कि ld: warning लाइन प्रासंगिक है, लेकिन हो सकता है। एटीएलएएस एक्सकोड के त्वरित ढांचे द्वारा प्रदान किया जाता है, और एक्सकोड के वर्तमान संस्करण में, यह अब /usr/lib64/atlas (या शायद यह कभी नहीं था) पर प्रतीत होता है। वह पथ केवल संभावित स्थापना स्थानों में से एक है, और सही पथ (/usr/local/atlas) ठीक से शामिल है।

  3. जब मैं ऊपर दिए गए फ़ंक्शन प्रोटोटाइप की खोज करता हूं, तो मुझे बहुत सारी एलएलवीएम सामग्री दिखाई देती है। यह सभी मैक ओएस एक्स त्रुटियों है। तो यह मैक-विशिष्ट है। लेकिन जब मैं जीसीसी प्रदान कर रहा हूं तो यह एलएलवीएम का उपयोग क्यों करेगा? क्या यह संकलन के लिए जीसीसी के सही संस्करण का उपयोग कर रहा है लेकिन गलत संस्करण से जुड़ने की कोशिश कर रहा है?

अंतिम शायद सबसे अच्छा परिकल्पना है। ऐसा लगता है कि यह त्रुटि केवल उन कंप्यूटरों पर दिखाई देती है जहां आप डिफ़ॉल्ट जीसीसी स्थापना (मैक, अर्थात्) को ओवरराइड नहीं कर सकते हैं।

मैं एक नया एटीएलएएस स्थापित नहीं कर सकता क्योंकि मैकबुक एयर पर थ्रॉटलिंग बंद करने का कोई ज्ञात तरीका नहीं है - एटीएलएएस इंस्टॉलेशन के लिए एक शर्त, इसलिए मैं ld चेतावनी को खत्म नहीं कर सकता।

क्या किसी के पास कोई विचार है कि इन त्रुटियों का क्या अर्थ हो सकता है? कंपाइलर/लिंकर गुरु? किसी को?

अद्यतन यह मेरे लिए हुआ mkmf.log में देखने के लिए, और मैं कुछ अतिरिक्त जानकारी मिल गया। निश्चित रूप से, यह एक एटलस समस्या है। लेकिन मुझे सच में यकीन नहीं है कि यह केवल एक निर्देशिका में क्यों दिख रहा है।

ld: warning: directory not found for option '-L/usr/lib64/atlas' 
Undefined symbols for architecture x86_64: 
    "_ATL_dgemm", referenced from: 
     _cblas_dgemm in libcblas.a(cblas_dgemm.o) 
    "_ATL_dsyreflect", referenced from: 
     _cblas_dgemm in libcblas.a(cblas_dgemm.o) 
    "_ATL_dsyrk", referenced from: 
     _cblas_dgemm in libcblas.a(cblas_dgemm.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <cblas.h> 
4: 
5: /*top*/ 
6: extern int t(void); 
7: int t(void) { void ((*volatile p)()); p = (void ((*)()))cblas_dgemm; return 0; } 
8: int main(int argc, char **argv) 
9: { 
10: if (argc > 1000000) { 
11:  printf("%p", &t); 
12: } 
13: 
14: return 0; 
15: } 
/* end */ 

"gcc -o conftest -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/x86_64-darwin13.0.0 -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/backward -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0 -I../../../../ext/nmatrix -I/usr/local/atlas/include -I/usr/include/atlas -Wall -Werror=return-type -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -Wall -Werror=return-type -O3 -Wno-error=shorten-64-to-32 -pipe conftest.c -L. -L/Users/jwoods/.rbenv/versions/2.0.0-p247/lib -L/usr/local/atlas/lib -L/usr/local/lib -L/usr/lib -L/usr/lib64/atlas -L. -L/Users/jwoods/.rbenv/versions/2.0.0-p247/lib -L/usr/local/lib -lcblas -llapack -lruby-static -lcblas -llapack -lpthread -ldl -lobjc " 
conftest.c:7:27: error: too few arguments to function call, expected 14, have 0 
int t(void) { cblas_dgemm(); return 0; } 
       ~~~~~~~~~~~^
/usr/local/atlas/include/cblas.h:470:1: note: 'cblas_dgemm' declared here 
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
^ 
1 error generated. 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <cblas.h> 
4: 
5: /*top*/ 
6: extern int t(void); 
7: int t(void) { cblas_dgemm(); return 0; } 
8: int main(int argc, char **argv) 
9: { 
10: if (argc > 1000000) { 
11:  printf("%p", &t); 
12: } 
13: 
14: return 0; 
15: } 
/* end */ 

उत्तर

0

मुझे विश्वास है कि मुझे एक जवाब मिला है। extconf.rb (जो मेकफ़ाइल उत्पन्न करता है) में lib खोज निर्देशिकाओं में से एक /usr/lib64/ था, जो सिस्टम पर मौजूद नहीं है। तो एक बार जब मैंने खोज पथ से इसे हटा दिया, तो यह संकलित और ठीक से जुड़ा हुआ था।

मैंने $libs परिभाषा में भी एक प्रविष्टि जोड़ी उपयोगी हो सकती है या नहीं भी हो सकती है।

यह करने के लिए $libs += " -llapack -lcblas -latlas " किया जा रहा से चला गया:

$libs += " -llapack -lclapack -lcblas -latlas " 

लेकिन है कि पिछले बिट, लिंक करने के दौरान नहीं के बाद मुद्दों को हल किया।

संबंधित मुद्दे

 संबंधित मुद्दे