2012-04-11 8 views
5

काम नहीं करता है, मैं समझने की कोशिश कर रहा हूं कि लिनक्स के तहत फोरट्रान में साझा लाइब्रेरी को गतिशील रूप से कैसे बनाएं और लिंक करें।फोरट्रान में साझा लाइब्रेरी, न्यूनतम उदाहरण

मैं दो फ़ाइलें: पहले एक, liblol.f90, इस तरह दिखता है:

subroutine func() 
    print*, 'lol!' 
end subroutine func 

मैं gfortran -shared -fPIC -o liblol.so liblol.f90

दूसरी फ़ाइल, main.f90 साथ यह संकलन, इस तरह दिखता है:

program main 
    call func() 
end program main 

जब मैं अब gfortran -L. -llol main.f90 -o main कमांड के साथ संकलित करने का प्रयास करता हूं, तो मुझे निम्न त्रुटि मिलती है:

/tmp/ccIUIhcE.o: In function `MAIN__': 
main.f90:(.text+0xa): undefined reference to `func_' 
collect2: ld returned 1 exit status 

मुझे समझ नहीं आता क्यों यह कहते हैं, "अपरिभाषित संदर्भ", के बाद से nm -D liblol.so के उत्पादन में मुझे इस देता है:

    w _Jv_RegisterClasses 
0000000000201028 A __bss_start 
       w __cxa_finalize 
       w __gmon_start__ 
0000000000201028 A _edata 
0000000000201038 A _end 
0000000000000778 T _fini 
       U _gfortran_st_write 
       U _gfortran_st_write_done 
       U _gfortran_transfer_character_write 
0000000000000598 T _init 
00000000000006cc T func_ 

क्या कोई अन्य पैरामीटर की जरूरत है?

उत्तर

8

केवल एक चीज है कि परिवर्तित करने की

gfortran -L. main.f90 -llol -o main 

हाँ, केवल main.f90 के रूप में, बहस के क्रम है और -llol उलट कर रहे हैं। मुझे उम्मीद है कि यह किसी को अपने जीवन के वर्ष बचाता है, मैं बस इस पर खो गया। संबंधित नोट पर, यदि आप ऐसे प्रोग्राम को संकलित करने का प्रयास कर रहे हैं जो LAPACK या BLAS का उपयोग करता है (जो मेरे लिए काम नहीं करता है और यही कारण है कि मैंने पहली बार साझा लाइब्रेरी बनाने की कोशिश की), यह भी लागू होता है।

gfortran mylapack.f90 -llapack -lblas -o mylapack 

इस का कारण यह पुस्तिका के पन्नों में पाया जा सकता है, विकल्प -l के लिए http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html के शीर्ष देखें::

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in `z', those functions may not be loaded.

स्रोत फ़ाइल का नाम पहले लिखें
संबंधित मुद्दे