2012-06-04 40 views
8

Tôi đang sử dụng Ubuntu 10.04 và cố gắng biên dịch một số mã sử dụng gfortran. Tại một số điểm Makefiles làm:lgfortran không tìm thấy

-L. -lgfortran 

và tôi nhận được lỗi

/usr/bin/ld: cannot find -lgfortran 

mặc dù nó đã được cài đặt:

ldconfig -p | grep fortran 
    libgfortran.so.3 (libc6,x86-64) => /usr/lib/libgfortran.so.3 

Làm thế nào tôi có thể sửa chữa nó?

Tái bút: Các Makefile:

## FLAGS 

CC:= gcc 
C++:= g++ 
CFLAGS:= -c -O -Dintel -g 
FC:= gfortran 
FFLAGS:= -c -O -cpp -g 
LD:= g++ 
LDFLAGS:= -O 


WETTER_CGAL_FLAGS:= -g 


#WETTER-Data 
WETTER_cgal: weather.cpp surface_alg.h $(WETTER_CGAL_OBJECTS) WATT_interface.h data.cpp 
    $(C++) $(WETTER_CGAL_FLAGS) -c weather.cpp -frounding-math 
    $(C++) -c data.cpp -frounding-math 
    $(LD) $(WETTER_CGAL_OBJECTS) weather.o data.o -o WETTER_cgal -L. -lgfortran -lgmp -lCGAL -frounding-math -fp-model 
+1

Bạn có thể cung cấp một Makefile tối thiểu tạo ra lỗi không? Nó nhất thiết phải là lỗi của nó, vì môi trường vỏ của bạn có vẻ ổn. –

+0

được thực hiện, các câu hỏi đã được cập nhật với thông tin đó – flow

Trả lời

12

Liệu có cơ hội nào phiên bản gfortran của bạn khác với các phiên bản của g++ của bạn? Hoặc có thể nó được cài đặt ở một vị trí khác?

Các -lname tùy chọn (trong trường hợp này là namegfortran) chỉ thị các mối liên kết để tìm kiếm một tập tin thư viện gọi libname.a trong đường dẫn tìm kiếm thư viện. Nếu tìm thấy và không có liên kết tĩnh nào được thực thi bởi tùy chọn -[B]static, trình liên kết sẽ tìm kiếm lại một lần nữa cho libname.so và liên kết với nó thay vì (nếu tìm thấy). Nếu không tìm thấy libname.a, sẽ xảy ra lỗi mặc dù có sự hiện diện của libname.so.

Nên có một libgfortran.a ở đâu đó trong cài đặt gfortran của bạn. Tìm kiếm nó với find và cung cấp đường dẫn đến g++ với -L/path/to/compiler/libs. Nếu g++ có cùng phiên bản với gfortran đường dẫn đến libgfortran.a của bạn sẽ có mặt trong đường dẫn tìm kiếm trong thư viện (vì cả hai thư viện tĩnh C/C++ và Fortran đều nằm trong cùng một vị trí). Nó sẽ không có mặt nếu cả hai trình biên dịch khác nhau trong phiên bản của họ mặc dù.

Ví dụ trên hệ thống dựa trên RedHat 64 bit libgfortran.a nằm ở /usr/lib/gcc/x86_64-redhat-linux/<GCC version>/ trong khi chia sẻ libgfortran.so.* được đặt trong /usr/lib64.

Giải pháp thay thế là thay thế -lgfortran bằng /usr/lib/libgfortran.so.3.

Tùy chọn -L. thay vì liên quan đến -lCGAL so với -lgfortran.

4

Tôi đã gặp vấn đề tương tự ngay hôm nay khi biên dịch ATLAS và có thể sửa lỗi bằng cách sử dụng liên kết tượng trưng từ libgfortran.so.3 đến libgfortran.so.

+0

Được rồi, điều này làm việc cho tôi, nhưng tại sao nó hoạt động? Ngoài ra, nó sẽ có thể chỉ cần tạo liên kết trong 'ld.so.conf.d /'? – Seanny123

3

Chỉ cần chắc chắn bạn:

gcc --version 

gfortan --version 

là giống nhau.

/usr/bin/ 

Chứa các phiên bản khác nhau.

Ví dụ: Nếu gcc--version returns 4.7.3gfortran --version 4.8, một hack đơn giản có thể là thực hiện những việc sau.

sudo cp /usr/bin/gcc-4.8 /usr/bin/gcc 

Nó sẽ hoạt động.

+0

Trong hệ thống của tôi, nó trỏ đến/etc/alternatives/gcc, tôi sử dụng lệnh 'alternative --config gcc' để chọn phiên bản thích hợp của gcc – Jijo

2

Tôi đã gặp sự cố tương tự và đã thử lệnh sau. Vấn đề đã được giải quyết bằng cách sử dụng điều này:

sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so

+0

Và nó đã giải quyết được vấn đề hay điều gì đã xảy ra khi bạn thử nó? –