2015-05-01 4 views
8

यह प्रश्न वहां कुछ अन्य लोगों से संबंधित है, जैसे RccpArmadillo या element-wise-multiplicationआरसीपीपी चेतावनी: "विकल्प के लिए निर्देशिका नहीं मिली '-एल/​​यूएसआर/स्थानीय/सेलर/गफ्फ्रान/4.8.2/gfortran'

हालांकि, मेरी सेटिंग्स ऐसी हैं कि मुझे नहीं पता कि मुझे मुझे चेतावनी दिए बिना आरसीसीपी चलाने के लिए क्या संपादित/सिमलिंक करना है।

मैं नवीनतम आर संस्करण का उपयोग कर मैक 10.9 (मैवरिक्स) पर हूं।

बहुत शुरुआत में, निम्नलिखित कोड मैं यहाँ RccpvsR से मिला कोशिश कर, मैं एक त्रुटि मिली:

ld: library not found for -lgfortran 
clang: error: linker command failed with exit code 1 (use -v to see invocation)` 

तब पर RccpArmadillo आधारित, मैं था निम्नलिखित:

# Update FLIBS in ~/.R/Makevars 
FLIBS=-L/usr/local/Cellar/gfortran/4.8.2/gfortran 
#Re-Install from source 
install.packages(c("Rcpp","RcppArmadillo","inline"),type="source") 
#Restart R 

यह था बस चीजों को आजमाएं क्योंकि मेरे पास /usr/local/Cellar/gfortran/ निर्देशिका नहीं है। वास्तव में, मेरे सारे libgfortran* फ़ाइलें यहाँ (macports dir पर) कर रहे हैं:

>ls /opt/local/lib/gcc48/libgfortran.* 
/opt/local/lib/gcc48/libgfortran.3.dylib  /opt/local/lib/gcc48/libgfortran.dylib 
/opt/local/lib/gcc48/libgfortran.a  /opt/local/lib/gcc48/libgfortran.spec 

और यहाँ /opt/local/lib/gcc48/gcc/x86_64-apple-darwin13/4.8.3/libgfortranbegin.a और मेरे पास कोई gfortran फ़ाइल कहीं भी की है।

फिर मैंने कोड RccpvsR को फिर से कोशिश की और आश्चर्य की बात है, यह काम किया! इसके अलावा इस तथ्य से है कि मैं एक चेतावनी मिलती है:

ld: warning: directory not found for option '-L/usr/local/Cellar/gfortran/4.8.2/gfortran' 

क्योंकि निश्चित रूप से, यह मौजूद नहीं है, लेकिन समारोह है कि कोड, cosineRcpp द्वारा बनाई गई, कोई समस्या नहीं के साथ चलाता है।

ln -s /opt/local/lib/gcc48/libgfortran.* /usr/local/lib/ 

और फिर हटाने/लाइन संपादित:

FLIBS=-L/usr/local/Cellar/gfortran/4.8.2/gfortran 

~/.R/Makevars पर

इसलिए, सभी कि, अगर कोई जानता है कि अगर मैं /opt/local/lib/gcc48/ के रूप में libgfortran फ़ाइलों simlink करने के लिए है पूछने के लिए

या यदि मुझे कुछ नया इंस्टॉल करना है।

आपके समय के लिए अग्रिम धन्यवाद!

+1

क्या आप ओएस एक्स पर मौका दे रहे हैं?आप आर-सिग-मैक में पूछना चाह सकते हैं; मुझे लगता है कि आपको एक्सकोड कमांड लाइन टूल्स या कुछ चाहिए। आरसीपीपी-डेवेल सूची भी मदद कर सकती है। मैं लिनक्स पर हूं जहां ये चीजें "बस काम करती हैं"। –

+0

हां, मैंने सवाल संपादित किया। मैं मैक 10.9.5 में हूं और नवीनतम आर संस्करण का उपयोग कर रहा हूं। मेरे पास एक्सकोड भी स्थापित है। फिर भी धन्यवाद! – Javier

+0

गोरफ्रान के लिए साइमन के "आर ऑन मैक" पृष्ठ की जांच करें। मुझे लगता है कि आपको कुछ और स्थापित करने की आवश्यकता हो सकती है। –

उत्तर

15

लघु उत्तर

बस FLIBS, उदा में libgfortran के लिए पथ डाल

FLIBS=-L/opt/local/lib/gcc48/ 

या, /usr/local/lib/ के भीतर फ़ाइलों सिमलिंक अगर आप उस के साथ सहज महसूस करते हैं। हालांकि, यह समाधान काफी भंगुर है क्योंकि यदि आप gfortran अद्यतन करते हैं, या इसे किसी भिन्न निर्देशिका में ले जाते हैं, तो इस पथ को अपडेट करना भूलना आसान है।

थोड़ा लंबा उत्तर

आप जैसे के रूप में libgfortran.dylib के लिए पथ के लिए gfortran क्वेरी कर सकता है

gfortran -print-file-name=libgfortran.dylib 

आप इसे सीधे अपने Makevars फ़ाइल में निष्पादित कर सकते हैं; जैसे

FLIBS = -L`gfortran -print-file-name=libgfortran.dylib | xargs dirname` 

अप्रचलित लांग उत्तर

gfortran उत्पादन से एक उचित FLIBS सीधे पार्स करने की कोशिश करो।

सबसे पहले, कुछ पृष्ठभूमि। /usr/local/Cellar निर्देशिका ओएस एक्स के लिए एक पैकेज प्रबंधक homebrew द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट पथ है। इसे macports के विकल्प के रूप में सोचें।

होमब्रू gfortran और gcc पैकेज के हिस्से के रूप में इसके संबंधित पुस्तकालय प्रदान करता है, और इसलिए पथ जहां यह फोरट्रान पुस्तकालय स्थापित करता है अब बदल गया है। हालांकि, इन्हें (सामान्य रूप से) gfortran -print-search-dirs का उपयोग करके खोजा जा सकता है। उदाहरण के लिए, अपने सिस्टम पर,

gfortran -print-search-dirs 

मुझे

install: /usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/ 
programs: =/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/ 
libraries: =/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../:/lib/x86_64-apple-darwin14.0.0/4.9.2/:/lib/:/usr/lib/x86_64-apple-darwin14.0.0/4.9.2/:/usr/lib/ 

स्प्लिट दे देंगे, और अनुसंधान के साथ मुद्रित, मैं देख रहा हूँ:

[[1]] 
[1] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/" 

[[2]] 
[1] "/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/"                      
[2] "/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/"                      
[3] "/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/"                       
[4] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/"                     
[5] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/"                      
[6] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/x86_64-apple-darwin14.0.0/4.9.2/" 
[7] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/"         

[[3]] 
[1] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/"                     
[2] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/x86_64-apple-darwin14.0.0/4.9.2/" 
[3] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/"         
[4] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../x86_64-apple-darwin14.0.0/4.9.2/"          
[5] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../"                  
[6] "/lib/x86_64-apple-darwin14.0.0/4.9.2/"                               
[7] "/lib/"                                       
[8] "/usr/lib/x86_64-apple-darwin14.0.0/4.9.2/"                              
[9] "/usr/lib/" 

मेरे मामले में, libgfortran वास्तव में यहाँ रहता है:

/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../ 

ए और इसलिए यह वह मार्ग है जिसे हम FLIBS पर पास करना चाहते हैं। लेकिन, बाहर खींच कि एक दर्द की तरह है, इसलिए सिर्फ FLIBS बता उपयोग करने के लिए जो कुछ भी रास्तों सामान्य रूप से gfortran द्वारा उपयोग किया जाता है:

gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||' 

यह अच्छा है, लेकिन हम एक प्रारूप में पुस्तकालय पथ संकलक के लिए उपयुक्त चाहते ; यानी -L के साथ प्रीपेड। के कि sed के साथ क्या करते हैं:

gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|' 

यह outputs (पठनीयता के लिए विभाजन)

-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/ 
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/x86_64-apple-darwin14.0.0/4.9.2/ 
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/ 
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../x86_64-apple-darwin14.0.0/4.9.2/ 
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../ 
-L/lib/x86_64-apple-darwin14.0.0/4.9.2/ 
-L/lib/ 
-L/usr/lib/x86_64-apple-darwin14.0.0/4.9.2/ 
-L/usr/lib/ 

सभी एक साथ यह संकेत मिलता है कि बाद कम से कम ओएस एक्स पर, आप के लिए काम करना चाहिए, लेकिन ऐसा करना चाहिए (में सामान्य) gfortran साथ किसी भी मंच पर काम (जब तक यह PATH पर है):

FLIBS=`gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|'` 

यह वह जगह है नहीं सही है, जैसे यदि आपके पास अपने पथों में रिक्त स्थान हैं तो यह असफल हो जाएगा - यदि आप करते हैं, तो 1) आप जो भी प्राप्त करते हैं उसके लायक हैं और 2) यह भी 'अपेक्षाकृत' आसान फिक्स होना चाहिए।

+2

ओह लड़का :) उस विवरण के लिए धन्यवाद। क्या हमें आरसीपीपी एफएक्यू में संबंधित प्रश्न अपडेट करना चाहिए? –

+0

@ केविन Ushey: मुझे होमब्रू के बारे में पता था, लेकिन जब से मैंने कभी इसका इस्तेमाल नहीं किया था, मुझे नहीं पता था कि '/ usr/local/cellar' डिफ़ॉल्ट निर्देशिका है। अब, मुझे आपका संक्षिप्त जवाब पसंद है (यह काम करता है) और मैं वास्तव में, वास्तव में अपने लंबे समय की तरह (यह भी काम करता है) पसंद है। आपकी मदद के लिए बहुत बहुत धन्यवाद! – Javier

1

@ केविन-ushey से जवाब देने के लिए एक छोटा सा ट्वीक (कि कम से कम मैं की जरूरत है, मैं Prezto का उपयोग करें) grep '^libraries:' को एकल उद्धरण जोड़ने किया गया था, जिसका परिणाम:

FLIBS=`gfortran -print-search-dirs | grep '^libraries:' | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|'` 

मेरी ~/.R/Makevars फाइल करने के लिए है कि रेखा को जोड़ने चाल है!

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