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 nichtg++
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, nach Nikos C. beraten, Boote ich bis OpenSUSE 12.2 liveCD (die gcc 4.7.1) auf einem anderen Rechner, aber bekam den gleichen Fehler.
Dann habe ich gepostet diese Frage zu OpenSUSE Foren.
Martin_helm Antwort zeigt, dass das problem ist distro-unabhängige und die Lösung ist trivial:
Diese funktioniert einwandfrei auf allen meinen Maschinen. Programm kann kompiliert werden mit
g++ prog.cpp -lquadmath
.extern "C"
ist nicht notwendig, mit GCC 4.8 oder höher, da<quadmath.h>
jetzt fügt das automatisch, wenn durch eine C++ - Datei. Es ist notwendig für die GCC 4.6 und 4.7, obwohl.