2012-05-08 39 views
11

Đây là lần đầu tiên tôi cố gắng biên dịch mã FORTRAN bằng cách sử dụng một makefile. Hệ điều hành là Ubuntu 12.04 LTS 64 bit. Tôi gặp phải các lỗi sau đây:"/ usr/bin/ld: không thể tìm thấy thư viện"

gfortran -o przm3123.exe canopy.o chem.o cnfuns.o cropdate.o datemod.o debug.o debug_cn.o f2kcli.o floatcmp.o furrow.o general.o i_errchk.o infnan.o inivar.o ioluns.o iosubs.o lambertw.o m_readvars.o utils.o wind.o fcscnc.o przm3.o rsexec.o rsinp1.o rsinp2.o rsinp3.o rsmcar.o rsmisc.o rsprz1.o rsprz2.o rsprz3.o rsprzn.o rsutil.o rsvado.o -L ../libanne4.0/lib -lwdm -ladwdm -lutil 
/usr/bin/ld: cannot find -lwdm 
/usr/bin/ld: cannot find -ladwdm 
collect2: ld returned 1 exit status 
make: *** [przm3123.exe] Error 1 

Yếu tố then chốt trong makefile là:

przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil 

Có bất cứ điều gì tôi có thể làm gì để khắc phục lỗi này? Tôi có nên thử các trình biên dịch khác không?

+3

Điều đầu tiên tôi sẽ kiểm tra là nếu bạn thực sự có 'libwdm.so' và' libadwdm.so'. Tôi cho rằng họ nên ở trong thư mục 'libanne4.0/lib' này. – birryree

+0

Có, 'libwdm.a' và' libadwdm.a' có ở đó. –

+0

Ồ, thư viện tĩnh. Bạn có thể thử điều này trong makefile của bạn? 'przm2_LIBS = -L ../ libanne4.0/lib -Wl, -Bdynamic -lutil -Wl, -Bstatic -lwdm -ladwdm' - Tôi giả sử' util' là 'libutil.so' (thư viện được chia sẻ) vì nó đã không không phàn nàn về điều đó. – birryree

Trả lời

10

../libanne4.0/lib là đường dẫn tương đối, bạn có thể thử thay đổi nó thành đường dẫn tuyệt đối.

Ngoài ra, bạn có thể kiểm tra xem quá trình liên kết có quyền truy cập và đọc libs hay không.


Cập nhật: Để có mối liên kết tìm thấy một thư viện quy định sử dụng tùy chọn -l<name> tên của libray sẽ lib<name>.[a|so] và tham số để -L phải chỉ con đường là thư viện tọa lạc.

-L cần phải đặt trước đó là tùy chọn -l.

Người ta có thể chỉ định -l và/hoặc -L nhiều lần.

+1

Cung cấp đường dẫn tuyệt đối, nhưng cùng một lỗi. Tôi đã thử 'ld adwdmlib.a' và có các lỗi sau:' ld: warning: không thể tìm thấy ký hiệu nhập _start; không thiết lập địa chỉ bắt đầu' cảm ơn –

+1

'adwdmlib.a' là gì? – alk

+1

adwdmlib.a là thư viện tôi cần đưa vào. Dựa trên quy tắc L và l bạn đã sửa đổi. Điều đó có nghĩa là 'przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil' không hoạt động vì tên của các lib đó không chính xác? –

1

Có điều gì đó sai với tên "adwdmlib.a". Cờ liên kết "-l adwdm" sẽ báo cho trình biên dịch mong đợi một tệp lib có tên "libadwdm.a", không phải là "adwdmlib.a". Điều này có hữu ích hay có liên quan không? Nếu tên thư viện của bạn là "adwdmlib.a", đó có thể là lý do tại sao người liên kết của bạn không thể tìm thấy nó.

+0

Cảm ơn bạn đã bình luận. Tôi đã cố gắng đổi tên các lib đó, nhưng mối liên kết vẫn không thể tìm thấy chúng. –

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