GMP unter Win8 in C++ IDE einbinden

M

meaStw

Gast
Hallo,

ich versuche schon seit ein paar Tagen die GMP Bibliothek in DevC++ einzubinden, leider nur mit mäßigem Erfolg.
Ich brauche eine Bibliothek, um beliebig große Zahlen in C++ zu handhaben. Deswegen erschien mir die GMP Bib ideal. Leider gibt es sie wohl nur in Quellcode zum runterladen und muss deswegen je nach Betriebsystem für den Gebrauch entsprechend kompiliert werden.
Das hab ich nach http://suchideas.com/journal/2007/07/installing-gmp-on-windows/ auch versucht, aber ohne Erfolg.

Des weiteren hab ich in DevC++ einen Package-Manager gefunden, mit dem man die GMP Bib als Package "einfach" als Erweiterung einbinden kann und zumindest findet er schonmal die Hauptdateien "gmpxx.h" und "gmp.h". Leider gibt es beim kompilieren immer noch Linker-Errors, die ich nicht nachvollziehen kann.

Test-Code:
#include <iostream>
#include <gmpxx.h>
using namespace std;
int main (void) {
mpz_class a, b, c;
a = 1234;
b = "-5678";
c = a+b;
cout << "sum is " << c << "\n";
cout << "absolute value is " << abs(c) << "\n";
cin >> a;
return 0;
}

Resultierende Fehler:
C:\Users\mr.bond\Desktop\Neuer Ordner\Default Profile\main.o In function `_gmp_expr'::
[Linker Error] undefined reference to `__gmpz_init'

Dann hab ich weiter recherchiert und beim Compileraufruf " -lgmpxx -lgmp" hinzugefügt - gab aber keine Änderung. Ausserdem hab ich die beiden oben genannten h-Dateien noch unter "Linker" in den Projektoptionen hinzugefügt.

Falls es mit der GMP Bib keine Lösung gibt, hat jemand noch eine andere Bilbiothek, die er mir empfehlen kann und die sich vielleicht auch relativ einfach und fehlerunanfällig installieren lässt? Ich muss große Zahlen effizient miteinander verrechnen können (Verschlüsselung, Primzahlen, Faktorisieren, etc).

Mit freundlichen Grüßen,
ragna

Edit: Vielleicht sei noch hinzuzufügen, dass die GMP Bib glaube ich für C gemacht wurde aber trotzdem mit C++ funktionieren sollte.
http://gmplib.org/manual/C_002b_002b-Interface-General.html#C_002b_002b-Interface-General
 
Zuletzt bearbeitet von einem Moderator:
Leider gibt es sie wohl nur in Quellcode zum runterladen und muss deswegen je nach Betriebsystem für den Gebrauch entsprechend kompiliert werden.
Dh du hast keine .so.0 Datei oder so die du dem Linker bekannt machen musst?
Hat die Lib selbst evtl. Abhängigkeiten die du nicht korrekt eingebunden hast?
 
Hallo,

ich tippe mal Du hast beim Linken die falsche Reihenfolge angegeben...
Bei mir (MinGW unter WinXP) funktionierts (in einer DOS-Box=Eingabeaufforderung) mit:
Code:
g++ -I<Pfad zu gmp-5.0.5>  -c gmptest.cpp

g++ -L<Pfad zu gmp-5.0.5\.libs>  gmptest.o -lgmpxx -lgmp -o gmptest
Der Pfad sollte so etwas wie z.B. "C:\abc\def\gmp-5.0.5" (ohne Anführungszeichen) sein.


HTH

BigNum
 
Ein schneller Test hat gerade keine Änderung bewirkt, ich muss da noch mal in Ruhe nach gucken, jedoch erst ab morgen Abend.

Sollte g++ als Compiler-Befehl allgemein bekannt sein? (Wenn ich cmd in sys32 starte)
Oder nur, wenn ich in das entsprechende Verzeichnis navigiert habe?
Bei mir kennt er den Befehl nämlich normal nicht.

MfG
 
ragna schrieb:
Sollte g++ als Compiler-Befehl allgemein bekannt sein? (Wenn ich cmd in sys32 starte)

Imho schon, da DevC++ gcc/g++ als Compiler und Linker benutzt...

ragna schrieb:
Oder nur, wenn ich in das entsprechende Verzeichnis navigiert habe?
Dann kannst Du entweder den vollen Pfad zu "g++" bei meinen zwei Compilier/Link-Zeilen angeben oder den Pfad zu "g++" (bzw. "gcc") in Deiner PATH-Systemvariable hinten anhängen.


HTH

BigNum
 
Tja, ich habe jetzt nochmal alles neu gebuildet und eingerichtet, aber es geht trotzdem nicht.
Aus dem GMP-Package hab ich mit Hilfe von MSYS dann die entsprechenden H- und A-Dateien gebuildet, die auch bei c:/dev-cpp/ unter libs bzw. include sind.
Dann hab ich unter DevC++ unter Parametern bei Linker noch jeweils erst gmpxx.a und als zweites gmp.a verlinkt, also die Pfade angegeben.

Jetzt gibt es folgende Fehler:

Compiler: Default GCC compiler
Building Makefile: "C:\project1\Makefile.win"
Executing make...
mingw32-make.exe -f "Makefile.win" all
g++.exe -lgmpxx -lgmp "Objects/MingW/main.o" -o "Output/MingW/Project1.exe" -L"C:/Dev-Cpp/lib/wx/gcc_lib" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/MinGW32/lib" "C:/Dev-Cpp/lib/libgmpxx.a" "C:/Dev-Cpp/lib/libgmp.a" -g3

C:/Dev-Cpp/lib/libgmpxx.a(ismpz.o):ismpz.cc:(.text+0xed): undefined reference to `_Unwind_Resume'
C:/Dev-Cpp/lib/libgmpxx.a(ismpz.o):ismpz.cc:(.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
C:/Dev-Cpp/lib/libgmpxx.a(osdoprnti.o):osdoprnti.cc:(.text+0xed): undefined reference to `_Unwind_Resume'
C:/Dev-Cpp/lib/libgmpxx.a(osdoprnti.o):osdoprnti.cc:(.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
C:/Dev-Cpp/lib/libgmpxx.a(ismpznw.o):ismpznw.cc:(.text+0x208): undefined reference to `_Unwind_Resume'
C:/Dev-Cpp/lib/libgmpxx.a(ismpznw.o):ismpznw.cc:(.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

Das "-lgmpxx -lgmp" hab ich irgendwo gelesen, sollte man noch hinzufügen. Ich frage mich noch, ob da eventuell noch Befehle vor die Pfade der A-Dateien im Compileraufruf müssen.

Vielleicht liegts ja nur an einem kleinen Buchstaben :)

Das builden der eigentlichen Bibliothek hat ja geklappt und auch beim "make check" war alles in Ordnung. Also kann es ja nur noch an der richtigen Verlinkung liegen. :(

Grüße
 
Zuletzt bearbeitet von einem Moderator:
GCC mag es lieber mit -L<pfad> und -l<lib> (ohne das lib am Anfang)
Also sowas wie -L/usr/lib/libxml2 und -lxml2 wenn die Bibliothek libxml2 heißt.
Du hast keine -l Optionen angegeben. Das dürfte das Problem sein.

€: Oh doch. Das habe ich übersehen, weil die normalerweise hinter -L stehen.
Womöglich ist das das Problem und außerdem, dass hinten noch die Bibliotheken
selbst mitangegeben sind.

€2: Die nicht aufgelösten Symbole werden anscheinend auch von libgmp aus
aufgerufen. Hast du die Bibliothek vielleicht dynamisch gelinkt und der Linker
weiß nicht, wo er die Abhängigkeiten hernehmen soll?
 
Zuletzt bearbeitet:
ragna schrieb:
g++.exe -lgmpxx -lgmp "Objects/MingW/main.o" -o "Output/MingW/Project1.exe" -L"C:/Dev-Cpp/lib/wx/gcc_lib" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/MinGW32/lib" "C:/Dev-Cpp/lib/libgmpxx.a" "C:/Dev-Cpp/lib/libgmp.a" -g3

C:/Dev-Cpp/lib/libgmpxx.a(ismpz.o):ismpz.cc:(.text+0xed): undefined reference to `_Unwind_Resume'
C:/Dev-Cpp/lib/libgmpxx.a(ismpz.o):ismpz.cc:(.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
C:/Dev-Cpp/lib/libgmpxx.a(osdoprnti.o):osdoprnti.cc:(.text+0xed): undefined reference to `_Unwind_Resume'
C:/Dev-Cpp/lib/libgmpxx.a(osdoprnti.o):osdoprnti.cc:(.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
C:/Dev-Cpp/lib/libgmpxx.a(ismpznw.o):ismpznw.cc:(.text+0x208): undefined reference to `_Unwind_Resume'
C:/Dev-Cpp/lib/libgmpxx.a(ismpznw.o):ismpznw.cc:(.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
1.) Hast Du auch "./configure" mit dem Parameter "--enable-cxx" aufgerufen? Also so
Code:
./configure  --enable-cxx
Es scheint, als ob Du die libgmpxx.a mit dem "gcc" statt dem "g++" gebaut hättest bzw. durch den fehlenden "--enable-cxx"-Parameter die libgmpxx.a gar nicht neu gebaut worden wäre. Sieht Dir mal das Datum der Datei "libgmpxx.a" an und vergleiche es mit dem Datum der Datei "libgmp.a".

2.) Dein Aufruf
ragna schrieb:
g++.exe -lgmpxx -lgmp "Objects/MingW/main.o" -o "Output/MingW/Project1.exe" -L"C:/Dev-Cpp/lib/wx/gcc_lib" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/MinGW32/lib" "C:/Dev-Cpp/lib/libgmpxx.a" "C:/Dev-Cpp/lib/libgmp.a" -g3
ist "doppelt gemoppelt".
Es sollte auch ein

g++ "Objects/MingW/main.o" -o "Output/MingW/Project1.exe" -L"C:/Dev-Cpp/lib/wx/gcc_lib" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/MinGW32/lib" "C:/Dev-Cpp/lib/libgmpxx.a" "C:/Dev-Cpp/lib/libgmp.a" -g3

tun.


HTH

BigNum
 
Zuletzt bearbeitet:
So, nach längerem Probieren mit diversen Entwicklungsumgebungen habe ich es, glaube ich, fast hinbekommen.

Ich benutze nun die Orwell Dev-C++ Umgebung, die im Gegensatz zu dem Bloodshet Dev-C++ auch aktuell ist.
Der Fehler im Compileraufruf lag daran, dass das "-lgmpxx -lgmp" am Ende des Aufrufs stehen muss, anstatt direkt nach dem g++.exe.

Jetzt wird das Test-Programm zwar ohne Fehler kompiliert, jedoch hab ich beim Ausführen noch einen Fehler, dass die "libgmp-10.dll" auf dem PC fehlt.
Die besagte DLL ist im Devcpp/bin Verzeichnis vorhanden und ich hab das Verzeichnis noch zu den Systemumgebungsvariablen hinzugefügt (das Verzeichnis einfach bei den Umgebungsvariablen unter Temp mit an die Path-Variable gehängt), jedoch keine Änderung.

Also noch einmal zur Kontrolle, wie es nun funktioniert:

Compiler: TDM-GCC 4.6.1 64-bit
Building Makefile "C:\test\Makefile.win"
Executing make...
mingw32-make.exe -f "C:\test\Makefile.win" all
g++.exe main.o -o Projekt1.exe -L"C:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -L"C:/Dev-Cpp/lib" -static-libgcc -lgmpxx -lgmp
Execution terminated
Compilation successful

Jetzt werde ich im Internet nach nochmal weiter nach einer Lösung suchen...

Edit: Anscheinend hat das irgendwas damit zu tun, dass die DLL eine 32-Bit Bib ist und ich Win8 64 Bit habe...

Edi2t: Wenn ich die DLL ins System32 Verzeichnis kopiere, ändert sich die Fehlermeldung in "xxx konnte aufgrund eines Problems nicht ausgeführt werden (0x0000007c)"
 
Zuletzt bearbeitet von einem Moderator:
ragna schrieb:
Der Fehler im Compileraufruf lag daran, dass das "-lgmpxx -lgmp" am Ende des Aufrufs stehen muss, anstatt direkt nach dem g++.exe.
Genau das meinte ich mit meinem
BigNum schrieb:
ich tippe mal Du hast beim Linken die falsche Reihenfolge angegeben...
War wahrscheinlich nicht deutlich genug...

Deshalb nochmal zur Klarstellung: Wichtig ist, daß die beiden Libs nach "main.o" kommen und "-lgmpxx -lgmp" genau in dieser Reihenfolge angegeben werden.

ragna schrieb:
Jetzt wird das Test-Programm zwar ohne Fehler kompiliert, jedoch hab ich beim Ausführen noch einen Fehler, dass die "libgmp-10.dll" auf dem PC fehlt.
Dann hast Du einen Fehler beim Bauen der GMP-Libs gemacht.

Darum nochmals die Fragen (mit der Bitte um explizite Beantwortung) an Dich:

1.) Welche Version von GMP verwendest Du (hoffentlich die neueste=5.0.5)?

2.) Wie sieht Dein "./configure"-Aufruf aus?

3.) Poste eine Liste der Dateien nach Aufruf von "make" im Verzeichnis "....gmp-5.0.5\.libs" mit Größenangabe und Datum auf.


ragna schrieb:
Also noch einmal zur Kontrolle, wie es nun funktioniert:

Compiler: TDM-GCC 4.6.1 64-bit
Building Makefile "C:\test\Makefile.win"
Executing make...
mingw32-make.exe -f "C:\test\Makefile.win" all
g++.exe main.o -o Projekt1.exe -L"C:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -L"C:/Dev-Cpp/lib" -static-libgcc -lgmpxx -lgmp
Execution terminated
Compilation successful
Execution terminated WTF???
Das passt für mich nicht so ganz zusammen: "Execution terminated" und dann trotzdem "Compilation successful"?

ragna schrieb:
Edit: Anscheinend hat das irgendwas damit zu tun, dass die DLL eine 32-Bit Bib ist und ich Win8 64 Bit habe...
Nein, wenn Du statisch linkst, brauchst Du keine GMP-DLL(s)!


HTH

BigNum
 
Ok,

1) Ich verwende die neuste Version, ja.

2) Mein Aufruf: ./configure --prefix=/c/build -enable-cxx
Dann "make", dann "make check", dann "make install"

3) Da raus kommt dann:


Nachtrag: Ich benutze Orwell Dev-C++ 5.3.0.2 mit dem MinGW32 4.70 Compiler

Nachtrag2: Jetzt scheint es zu funktionieren, diesmal hat das "make" sehr viel länger gedauert, als beim ersten Mal.
 
Zuletzt bearbeitet von einem Moderator:
"./configure"-Aufruf sieht gut aus, die Dateien im ".libs"-Verzeichnis sehen auch i.O. aus.


ragna schrieb:
Nachtrag2: Jetzt scheint es zu funktionieren, diesmal hat das "make" sehr viel länger gedauert, als beim ersten Mal.
D.h. es wird nicht mehr nach einer DLL verlangt und das Programm tut so wie es soll?


BigNum
 
Ja genau, allerdings benutze ich jetzt den MinGW32 Compiler, also alles als 32Bit Programm.
Jetzt ist die Frage, ob 64 Bit eventuell schneller wäre.

Hier gibts auch ne 64 Bit Version von einem Compiler, http://orwelldevcpp.blogspot.de/, muss ich auch noch mal testen...

Edit: Leider funktioniert der 64 Bit Compiler nicht, er sagt, die .a-Dateien seien nicht kompatibel.
 
Zuletzt bearbeitet von einem Moderator:
Ich tippe mal, daß die 64-Bit-Variante je nach Anwendungsfall (Integer, Float, Rational) schon wesentlich schneller ist.

Du kannst es ja mal benchen und hier posten, es würde mich auch stark interessieren!

ragna schrieb:
Edit: Leider funktioniert der 64 Bit Compiler nicht, er sagt, die .a-Dateien seien nicht kompatibel.
Ja, klar, Du musst natürlich Alles (Libs + main) neu bauen!


HTH

BigNum
 
Ja, ich würde gerne ein paar Geschwindigkeits-Tests durchführen.
Das Problem bei 64 Bit ist, dass es glaube ich ein anderer Compiler ist (weiß grade nicht, ob es MinGW 64 gibt) und ich nicht weiß wie man den configure-Befehl ändern muss um 64 Bit Bibs zu erhalten.

So wie ich das verstanden habe, hat er ja bei dem configure-Befehl mein System analysiert und dahingehend passend die h- und a-Dateien gebaut. Da hätte er ja eigentlich von sich aus schon 64 Bit Dateien bauen müssen, da mein Prozessor 64 Bit unterstützt und das OS ja auch.

Ich sehe beim Schreiben gerade, dass hier http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS etwas davon steht, dass man bei MSYS (dass ich zum builden genutzt habe) noch ein "--host" hinzufügen kann mit entsprechenden Parametern.

Edit: Führe den configure-Befehle mit zusätzlichem "--host=x86_64-w64-mingw32" aus, er beschwert sich erstmal darüber, dass er keinen funktionierenden Compiler gefunden hat.

Edit2: Der build war erfolgreich aber das Kompilieren geht mal wieder nicht. Problem scheint der Linker Befehl "-lgmpxx -lgmp" oder die gebuildeten Dateien zu sein.
Fehler mit Linker-Parametern:
skipping incompatible C:\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libgmpxx.a when searching for -lgmpxx

Rufe grade den configure Befehl nochmal auf mit: "--host=i686-w64-mingw32 --build=i686-w64-mingw32 --enable-cxx --disable-shared", mal sehen, ob sich da was ändert.
-> Da sagt er aber auch, dass die inkompatibel sind.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben