r फोरट्रान प्रतीक लोड तालिका में नहीं(आर में लोड किए गए प्रतीक को कॉल करने में असमर्थ)



dll fortran (0)

मैं विंडोज 7 64 बिट्स पर आर के भीतर उपयोग के लिए Absoft Pro फोरट्रान 13.0.3, 64 बिट्स के साथ एक फोरट्रान डीएलएल बनाने की कोशिश कर रहा हूं।

ये मेरी फ़ाइल है mycalc.f (यह एक गूंगा उदाहरण है, बस कार्यक्षमता का परीक्षण करने के लिए):

subroutine mycalcf(a,b,c)
real*8 a,b,c
dll_export mycalcf
c=a+b*b
end

बयान dll_export मानक नहीं है, लेकिन कुछ dll_export कम्पाइलर में पाया जाता है (एएएएआईआईएक्स यह लाहे और सीवीएफ में भी पाया जाता है और इंटेल फोर्ट्रान के बजाय एक संकलक निर्देश है)। यह सिर्फ कंपाइलर को बताता है कि कौन-से प्रतीकों को निर्यात किया जाना चाहिए।

मैं successfuly साथ संकलन: af90 -m64 -dll -YDLL_NAMES=LCS mycalc.f -o mycalc.dll

विकल्प- -YDLL_NAMES=LCS संकलक को लोअरकेस प्रतीकों वाले लाइब्रेरी बनाने के लिए कहता है, जो आर के लिए बेहतर लगता है।

अगर मैं dumpbin /exports mycalc.dll , तो मैं अपने सीएलसीएफ को निर्यात किए गए प्रतीकों में, लोअरकेस में, पहले या बाद में किसी भी अंडरस्कोर के बिना मिल सकता है।

अब, आर (64 बिट संस्करण) से, निम्न कार्य करता है:

dyn.load("mycalc.dll")
is.loaded("mycalcf")
.Fortran("mycalcf", a=4, b=5, c=0)

मुझे रिटर्न पर c = 29 मिलता है, जैसा कि उम्मीद है

परन्तु , यदि मैं आर को पुनरारंभ करता हूँ, तो निम्न काम नहीं करता है (नोटिस मैं केवल is.loaded टेस्ट को हटा दिया है):

dyn.load("mycalc.dll")
.Fortran("mycalcf", a=4, b=5, c=0)

मुझे त्रुटि मिलती है: Fortran symbol name "mycalcf" not in load table

अब मेरा सवाल है: यह परीक्षा इतनी महत्वपूर्ण क्यों है?

तुलना के लिए, जब मैं एब्सॉफ्ट के बदले गफररेन के साथ एक कोशिश करता हूं, तो मुझे कोई समस्या नहीं है। मैं संकलित करता हूं: gfortran -m64 -shared -o mycalc2.dll mycalc.f (dll_export कथन को टिप्पणी करने के बाद, जो कि जरूरी नहीं है, और न ही गफररेन द्वारा भी मान्यता प्राप्त है)। फिर आर में:

dyn.load("mycalc2.dll")
.Fortran("mycalcf", a=4, b=5, c=0)

और मुझे सी = 2 मिलता है, कोई त्रुटि नहीं।

अब, मुझे संदेह है कि जीसीसी लिंकर ऐसा कुछ करता है जो Absoft linker (वास्तव में यह माइक्रोसॉफ्ट के लिंक। एक्सई) द्वारा स्वचालित रूप से नहीं किया जाता है। लेकिन मेरे पास कोई संकेत नहीं है कि यह क्या हो सकता है।

किसी भी विचार का स्वागत है!

ठीक है, व्लादिमीर से एक अच्छा सवाल के बाद समाधान (टिप्पणी देखें)। असल में, किसी को प्रतीकों के नामों से जोड़ना चाहिए। चूंकि कंपाइलर विकल्प से ऐसा करने का कोई रास्ता नहीं है, CDEC$ निर्देशों की आवश्यकता है ( एचपी या इंटेल दस्तावेज़ देखें)

यहाँ यह बस है:

      subroutine mycalcf(a,b,c)
CDEC$ attributes alias:'mycalcf_' :: mycalcf
      real*8 a,b,c
      dll_export mycalcf
      c=a+b*b
      end

दूसरा समाधान, Absoft मंच से : वास्तव में मैं बहुत शुरुआत से गलत था मैंने जो सोचा था उसके विपरीत, किसी को dll_export कथन का उपयोग करने की आवश्यकता नहीं है, और यह भी समस्या पेश की है: इसके बिना, कंपाइलर अधोरेखण जोड़ता है सभी प्रतीकों को डिफ़ॉल्ट रूप से निर्यात किया जाता है, जैसे कि गफररेन में। तो सही कोड बस है:

      subroutine mycalcf(a,b,c)
      real*8 a,b,c
      c=a+b*b
      end

लोअरकेस प्रतीकों को प्राप्त करने के लिए किसी भी विकल्प की भी आवश्यकता नहीं है, यह भी चूक है

हालांकि, एक प्रश्न बाकी है: आर फ़ंक्शन। .Fortran हमेशा अंडरस्कोर जोड़ता है (क्या यह बताए जाने का कोई तरीका नहीं है?), और अगर यह हमेशा जोड़ा जाता है, तो कॉल काम कब is.loaded है। is.loaded है पहले से ही? ऐसा लगता है कि कुछ अजीब बात कर रहे हैं। मैंने ट्रैक करने की कोशिश की है, आर स्रोत कोड में ( do_isloaded करने के लिए, src\main\dotcode.c ), कोई फायदा नहीं हुआ।