2012-12-08 15 views
5

に私は、サンプルコードがあります。リンク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-fortranlibquadmath46パッケージで提供されています。

cosqと他の4倍関数をC++で使用する適切な方法は何ですか?私はそれらのためにFortranラッパーを書いていません。

+0

/usr/lib64/libquadmath.so.0が存在しますか? 'file/usr/lib64/libquadmath。* 'の出力は何ですか。 –

+0

すべてのファイルが存在します。存在しなければ、リンカーは存在しないというエラーを出力します。 '/ 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

+0

'cosq_(foo);'を使用すると動作しますか? –

答えて

5

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

次に、この質問をOpenSUSE forumsに掲載しました。

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

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

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

+3

N.B. ' 'はC++ファイルにインクルードされたときに自動的に追加されるので、' extern "C"はGCC 4.8以降では必要ありません。しかし、GCC 4.6と4.7では必要です。 –

関連する問題