Ссылка libquadmath с C++ на 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
Все эти команды выдают одну и ту же ошибку:
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...
Результат был таким же.
Тогда я попытался использовать 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
пакеты.
Как правильно использовать cosq
и другие квадратные функции в C++? Я не хотел бы писать обертки Фортрана для них.
1 ответ
Во-первых, согласно совету Никоса С., я загружаю OpenSUSE 12.2 liveCD (с gcc 4.7.1) на другой машине, но получаю ту же ошибку.
Затем я разместил этот вопрос на форумах OpenSUSE.
Ответ Martin_helm показывает, что проблема не зависит от дистрибутивов, а решение тривиально:
extern "C" {
#include <quadmath.h>
}
Это прекрасно работает на всех моих машинах. Программа может быть скомпилирована с g++ prog.cpp -lquadmath
,