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-fortran
và libquadmath46
.
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.
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. *' –
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
Tính năng này có hoạt động khi bạn sử dụng 'cosq_ (foo);'? –