2012-04-11 32 views
5

Tôi đang cố gắng hiểu cách tạo và liên kết động thư viện được chia sẻ trong Fortran trong Linux.Thư viện được chia sẻ ở Fortran, ví dụ tối thiểu không hoạt động

Tôi có hai tập tin: Người đầu tiên, liblol.f90, trông như thế này:

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

tôi biên dịch nó với gfortran -shared -fPIC -o liblol.so liblol.f90

Các tập tin thứ hai, main.f90, trông như thế này:

program main 
    call func() 
end program main 

Khi tôi bây giờ cố gắng biên dịch với lệnh gfortran -L. -llol main.f90 -o main, tôi nhận được lỗi sau:

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

Tôi không hiểu tại sao nó nói "tài liệu tham khảo không xác định", vì đầu ra của nm -D liblol.so mang lại cho tôi điều này:

    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_ 

Có bất kỳ thông số khác cần thiết?

Trả lời

8

Điều duy nhất mà đã được thay đổi là thứ tự của các đối số, như trong

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

Vâng, chỉ main.f90 và -llol bị đảo ngược. Tôi hy vọng điều này giúp tiết kiệm một ai đó trong năm của cuộc đời của anh ấy tôi chỉ mất đi điều này. Trên một lưu ý liên quan, nếu bạn đang cố gắng biên dịch một chương trình sử dụng LAPACK hoặc BLAS (mà không làm việc cho tôi và là lý do tại sao ở nơi đầu tiên tôi đã cố gắng tạo một thư viện được chia sẻ), điều tương tự cũng được áp dụng. Viết tên của file nguồn đầu tiên:

gfortran mylapack.f90 -llapack -lblas -o mylapack 

Lý do cho điều này có thể được tìm thấy trong các trang thủ công, xem đầu http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html cho các tùy chọn -l:

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.

Các vấn đề liên quan