6

サンプルコードがあります:

#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)'

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...

結果は同じでした。

次にcosq、Fortranで使用しようとしました。

PROGRAM test

        REAL*16 foo
        REAL*16 res

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

このプログラムはコンパイルと実行がうまくいくので(たくさんの数字で答えを出力します)、そのcosq中で動作します。このプログラムはオプションなしでコンパイルされました:gfortran f128.f90

OSはOpenSUSE12.1、gccバージョンは4.6.2です。上記の*.h、*。a、および* .soファイルは、gcc46-fortranおよびlibquadmath46パッケージによって提供されます。

cosqC ++でおよびその他のquadmath関数を使用する適切な方法は何ですか?それらのためにFortranラッパーを書きたくありません。

4

1 に答える 1

5

まず、Nikos C.のアドバイスによると、OpenSUSE 12.2 liveCD(gcc 4.7.1)を別のマシンで起動しましたが、同じエラーが発生しました。

次に、この質問をOpenSUSEフォーラムに投稿しました。

Martin_helmの回答は、問題がディストリビューションに依存せず、解決策が簡単であることを示しています。

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

これは私のすべてのマシンで正常に機能します。プログラムはでコンパイルできますg++ prog.cpp -lquadmath

于 2012-12-08T20:38:58.213 に答える