2012-12-08 27 views
5

Tôi có một mã ví dụ:Liên kết libquadmath với C++ trên Linux

#include <quadmath.h> 

int main() 
{ 
    __float128 foo=123; 
    cosq(foo); 
    return 0; 
} 

tôi đã cố gắng để biên dịch nó với các lệnh sau:

g++ f128.cpp -lquadmath 
g++ f128.cpp /usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a 
g++ f128.cpp /usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a /usr/lib64/libquadmath.so.0 
g++ f128.cpp /usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a /usr/lib64/libquadmath.so.0 /usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a 

Tất cả các lệnh sản xuất một và lỗi tương tự:

f128.cpp:(.text+0x1b): undefined reference to `cosq(__float128)' 

Tôi cũng đã cố gắng khai báo cosq như sau, không bao gồm quadmath.h. Các tuyên bố về kiểu như vậy được sử dụng trong giao diện C++ cho các chương trình con fortran trong các chương trình khác, và chúng hoạt động tốt.

extern "C" __float128 cosq_(__float128 *op); 
extern "C" __float128 cosq_(__float128 op); 
extern "C" __float128 cosq(__float128 *op); 
...and so on... 

Kết quả giống nhau.

Sau đó, tôi cố gắng sử dụng cosq trong Fortran:

PROGRAM test 

     REAL*16 foo 
     REAL*16 res 

     foo=1; 
     res=cos(foo) 
     PRINT *,res 
END 

Chương trình này biên soạn và thực hiện tốt (in câu trả lời với rất nhiều chữ số), vì vậy cosq công trình trong đó. Chương trình này được biên soạn không có tùy chọn: gfortran f128.f90.

Hệ điều hành là OpenSUSE 12.1, phiên bản gcc là 4.6.2. * .h, * .a và * .so các tệp được đề cập được cung cấp bởi các gói gcc46-fortranlibquadmath46.

Cách thích hợp để sử dụng cosq và các chức năng quadmath khác trong C++ là gì? Tôi không muốn viết các trình bao bọc Fortran cho chúng.

+0

Bạn có chắc chắn /usr/lib64/libquadmath.so.0 tồn tại không? Đầu ra của: 'file/usr/lib64/libquadmath. *' –

+0

Tất cả các tệp tồn tại. Nếu nó không tồn tại, linker sẽ in một lỗi về không tồn tại. '/ usr/lib64/libquadmath.so.0' là liên kết tượng trưng đến'/usr/lib64/libquadmath.so.0.0.0', là thư viện thực sự. '/ usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a' cũng thoát. Liên kết với '-lquadmath' tạo ra lỗi được hiển thị ở trên, nhưng không phải là lỗi thư viện bị thiếu. – Sergey

+0

Tính năng này có hoạt động khi bạn sử dụng 'cosq_ (foo);'? –

Trả lời

5

Trước tiên, theo lời khuyên của Nikos C., tôi khởi động LiveCD OpenSUSE 12.2 (có gcc 4.7.1) trên máy khác, nhưng có cùng lỗi.

Sau đó, tôi đã đăng câu hỏi này lên OpenSUSE forums.

Martin_helm của câu trả lời cho thấy vấn đề là distro độc lập và giải pháp là tầm thường:

extern "C" { 
#include <quadmath.h> 
} 

này hoạt động tốt trên tất cả các máy của tôi. Chương trình có thể được biên dịch với g++ prog.cpp -lquadmath.

+3

N.B. 'Extern" C "' là không cần thiết với GCC 4.8 hoặc mới hơn, bởi vì '' bây giờ thêm tự động khi được bao gồm bởi một tệp C++. Nó là cần thiết cho GCC 4.6 và 4.7 mặc dù. –

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