に私は、サンプルコードがあります。リンクlibquadmath ++のlinux
#include <quadmath.h>
int main()
{
__float128 foo=123;
cosq(foo);
return 0;
}
を私は次のコマンドでコンパイルしてみました:
: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
これらのコマンドはすべて1と同じエラーが発生します
f128.cpp:(.text+0x1b): undefined reference to `cosq(__float128)'
Iはまた、次のようにinludingことなく、cosq
を宣言しようとしたquadmath.h
。このようなスタイルの宣言は、他のプログラムのFortranサブルーチンへのC++インターフェイスで使用され、うまく動作します。
extern "C" __float128 cosq_(__float128 *op);
extern "C" __float128 cosq_(__float128 op);
extern "C" __float128 cosq(__float128 *op);
...and so on...
結果は同じでした。
は、それから私は、Fortranでcosq
を使用しようとしました:
PROGRAM test
REAL*16 foo
REAL*16 res
foo=1;
res=cos(foo)
PRINT *,res
END
このプログラムはコンパイルして(数字のたくさんの答えを出力します)も実行し、それでcosq
作品。このプログラムはオプションなしでコンパイルされました:gfortran f128.f90
。
OSはOpenSUSE 12.1で、gccのバージョンは4.6.2です。 * .h、* .a、* .soファイルはgcc46-fortran
とlibquadmath46
パッケージで提供されています。
cosq
と他の4倍関数をC++で使用する適切な方法は何ですか?私はそれらのためにFortranラッパーを書いていません。
/usr/lib64/libquadmath.so.0が存在しますか? 'file/usr/lib64/libquadmath。* 'の出力は何ですか。 –
すべてのファイルが存在します。存在しなければ、リンカーは存在しないというエラーを出力します。 '/ usr/lib64/libquadmath.so.0'は'/usr/lib64/libquadmath.so.0.0.0'へのシンボリックリンクです。これは実際のライブラリです。 '/ usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a'も終了します。 '-lquadmath'とリンクすると、上記のエラーが生成されますが、ライブラリエラーがありません。 – Sergey
'cosq_(foo);'を使用すると動作しますか? –