我有一个示例代码:
#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
所有这些命令都会产生同一个错误:
f128.cpp:(.text+0x1b): undefined reference to `cosq(__float128)'
我还尝试按如下方式声明cosq
,但不包括quadmath.h
。这种样式的声明在C ++接口中用于其他程序中的fortran子程序,并且它们运行良好。
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
。
操作系统是OpenSUSE 12.1,gcc版本是4.6.2。 * .h,* .a和* .so文件由gcc46-fortran
和libquadmath46
个软件包提供。
在C ++中使用cosq
和其他四元函数的正确方法是什么?我不想为他们写Fortran包装。
答案 0 :(得分:5)
首先,据Nikos C.建议,我在另一台机器上启动了OpenSUSE 12.2 liveCD(它有gcc 4.7.1),但是出现了同样的错误。
然后我将此问题发布到OpenSUSE forums。
Martin_helm的回答表明这个问题与发行版无关,解决方案很简单:
extern "C" {
#include <quadmath.h>
}
这适用于我的所有机器。可以使用g++ prog.cpp -lquadmath
编译程序。