Link libquadmath mit c++ unter linux

Habe ich ein Beispiel-code:

#include <quadmath.h>

int main()
{
    __float128 foo=123;
    cosq(foo);
    return 0;
}

Habe ich versucht zu kompilieren Sie es mit den folgenden Befehlen:

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

Alle diese Befehle produzieren ein und den selben Fehler:

f128.cpp:(.text+0x1b): undefined reference to `cosq(__float128)'

Ich habe auch versucht zu erklären cosq wie folgt, ohne Knickschutz quadmath.h. Erklärungen solcher Art sind in C++ - Schnittstelle für fortran-Unterprogramme in anderen Programmen, und Sie funktionieren gut.

extern "C" __float128 cosq_(__float128 *op);
extern "C" __float128 cosq_(__float128 op);
extern "C" __float128 cosq(__float128 *op);
...and so on...

Ergebnis war das gleiche.

Dann habe ich versucht zu verwenden cosq in Fortran:

PROGRAM test

        REAL*16 foo
        REAL*16 res

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

Dieses Programm kompiliert und ausgeführt, sowie (druckt die Antwort auf viele Ziffern), so cosq arbeitet in der it. Dieses Programm wurde zusammengestellt mit keine Optionen: gfortran f128.f90.

OS ist OpenSUSE 12.1, gcc version 4.6.2. *.h, *.ein-und *.so erwähnten Dateien sind vorhanden, die von gcc46-fortran und libquadmath46 Pakete.

Was ist die richtige Art und Weise zu verwenden cosq und andere quadmath-Funktionen in C++? Ich möchte nicht zu schreiben Fortran-Wrapper für Sie.

  • Sind Sie sicher, dass /usr/lib64/libquadmath.so.0 vorhanden ist? Was ist die Ausgabe: file /usr/lib64/libquadmath.*
  • Alle Dateien sind vorhanden. Wenn Sie nicht existiert, linker drucken würde eine Fehlermeldung über nonexistance. /usr/lib64/libquadmath.so.0 ist der symlink zu /usr/lib64/libquadmath.so.0.0.0, das ist die eigentliche Bibliothek. /usr/lib64/gcc/x86_64-suse-linux/4.6/libquadmath.a Ausfahrten zu. Die Verknüpfung mit -lquadmath erzeugt den Fehler oben gezeigt, aber nicht eine fehlende library-Fehler.
  • Funktioniert es, wenn Sie verwenden cosq_(foo);?
  • Nein, tut es nicht. Außerdem funktioniert es nicht wenn ich cosq_(&foo) und entsprechende extern Deklaration, die richtiger wäre, für die Funktionen, die in Fortran geschrieben.
  • Ich nehme an, es ist auch nicht die Arbeit für plain C, richtig? Das sieht wie ein bug zu mir. Es sei denn, Sie sollen Sie einige zusätzliche Paket vom suse-repo.
  • Meinst du das gleiche Programm, kompiliert mit gcc, aber nicht g++ unter plain C? Ja, es funktioniert nicht. Es gibt nichts mehr über quadmath in meine repos, also werde ich versuchen, suchen einige zusätzliche repos und kompilieren Sie die Bibliothek aus dem gcc-Quellen, vielleicht hilft es ja. Auf jeden Fall danke für deine Hilfe, Mühe.
  • Versuchen Sie, installieren Sie eine neuere version von openSUSE (vielleicht in VirtualBox). Ich vermute stark das ist ein bug, der behoben wurden. Oder, alternativ, versuchen Sie ein repo, das Ihnen GCC 4.7.2 für openSUSE 12.1.

InformationsquelleAutor Sergey | 2012-12-08
Schreibe einen Kommentar