Forum: Compiler & IDEs gmp.h einbinden


von Butterberger (Gast)


Lesenswert?

Tag,

ich habe Quellcode, der <gmp.h> einbinden möchte ( #include <gmp.h> ).

Ich habe jetzt etwas von https://gmplib.org/‎ runtergeladen; aber was 
mache ich jetzt? Muss ich das extra bauen oder installieren? Das macht 
doch keinen Sinn...

Wie bekomme ich <gmp.h> in den Bauprozess von Xilinx SDK?

von Axel S. (a-za-z0-9)


Lesenswert?

Butterberger schrieb:

> ich habe Quellcode, der <gmp.h> einbinden möchte ( #include <gmp.h> ).

OK

> Ich habe jetzt etwas von https://gmplib.org/‎ runtergeladen; aber was
> mache ich jetzt? Muss ich das extra bauen oder installieren? Das macht
> doch keinen Sinn...

So so. Du hast also etwas heruntergeladen. Was denn? Aber wenn es 
etwas ist, dann wirst du es wohl irgendwie verwenden müssen. SCNR.

> Wie bekomme ich <gmp.h> in den Bauprozess von Xilinx SDK?

Bahnhof.

Wie es aussieht, will der von dir verwendete Code Funktionen aus der GMP 
Library (GMP = GNU multiple precision) verwenden. Dazu inkludiert der 
Quellcode das entsprechende Headerfile gmp.h (damit weiß der Compiler, 
welche Funktionen in der Library vorhanden sind). Beim Linken des 
Programms(?) braucht der Linker dann auch den Objectcode der GMP Lib. 
Der befindet sich typischerweise in libgmp.a (statische Lib).

Abhängig davon was genau du heruntergeladen hast, mußt du das entweder 
nur installieren oder vorher noch kompilieren. Und natürlich hängen die 
Details auch davon ab, ob du ein Programm bauen willst das auf deinem PC 
laufen soll oder auf einem µC.

Wie man C-Libraries verwendet, solltest du in einem Buch nachlesen. Das 
sind Grundlagen. Ohne die kommst du nirgendwo hin.


XL

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bevor GMP benutzt werden kann, muß es installiert werden:

https://gmplib.org/manual/Installing-GMP.html

Du kannst es auch selbst compilieren und den Install-Pfad beim configure 
mit --prefix angeben.  Be Verwendung sind dann allerdings die 
Include-Pfade (z.B. mit -I beim GCC) und Library-Pfade (z.B. mit -L beim 
GCC als Linker-Treiber) anzugeben.

Zudem wird mit -lgmp gelinkt, damit Referenzen nach libgmp (.a, .so. 
.dll, ...) aufgelöst werden können.

von Butterberger (Gast)


Lesenswert?

Axel Schwenke schrieb:
> Dazu inkludiert der Quellcode das entsprechende Headerfile gmp.h

Leider hat die runtergeladene gmp-5.1.3 keine gmp.h , sondern nur eine 
gmp-h.in .

> Beim Linken des
> Programms(?) braucht der Linker dann auch den Objectcode der GMP Lib.
> Der befindet sich typischerweise in libgmp.a (statische Lib).

Auch eine *.a Datei gibt es nicht.

> Abhängig davon was genau du heruntergeladen hast, mußt du das entweder
> nur installieren oder vorher noch kompilieren. Und natürlich hängen die
> Details auch davon ab, ob du ein Programm bauen willst das auf deinem PC
> laufen soll oder auf einem µC.

Das soll auf einen µC.
Das heißt wohl ich muss den Code kompilieren.
Weiß jmd, wie ich das mit Xilinx SDK kompiliere?

von Karl Käfer (Gast)


Lesenswert?

Hallo Butterberger,

Butterberger schrieb:
> Tag,
>
> ich habe Quellcode, der <gmp.h> einbinden möchte ( #include <gmp.h> ).
>
> Ich habe jetzt etwas von https://gmplib.org/‎ runtergeladen; aber was
> mache ich jetzt? Muss ich das extra bauen oder installieren? Das macht
> doch keinen Sinn...
>
> Wie bekomme ich <gmp.h> in den Bauprozess von Xilinx SDK?

https://gmplib.org/manual/Installing-GMP.html#Installing-GMP
https://gmplib.org/manual/Headers-and-Libraries.html#Headers-and-Libraries

HTH,
Karl

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Butterberger schrieb:
> Axel Schwenke schrieb:
>> Dazu inkludiert der Quellcode das entsprechende Headerfile gmp.h
>
> Leider hat die runtergeladene gmp-5.1.3 keine gmp.h , sondern nur eine
> gmp-h.in .

Die gmp.h wird daraus während des Build-Vorgangs erstellt.  Wie der 
Build-Vorgang vonstatten geht, steht in der oben verlinkten Doku, im 
Wesentlichen
1
./configure
2
make
3
make install # als root

Oder du installierst GMP über einen Packet-Manager falls deine 
Linux-Distro GMP mitbringt.

> Auch eine *.a Datei gibt es nicht.

Wird beim Buld-Vorgang erstellt.

> Das soll auf einen µC.
> Das heißt wohl ich muss den Code kompilieren.

Musst du eh, auch wenn's auf einen PC soll.  Für einen µC liest du Doku 
zu den configure-Optionen --host und --build, d.h. die GMP muß 
cross-compiliert werden.  In dem Fall willst du GMP nicht 
nach /usr/local installieren, d.h. du willst nicht die Standard 
--prefix vewrwenden.

Wie in der Doku zu lesen, verwendet die GMP das in der Linux-Welt 
übliche Build-System.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wird deine Plattform denn überhaupt von GMP unterstützt?

von Axel S. (a-za-z0-9)


Lesenswert?

Butterberger schrieb:
> Axel Schwenke schrieb:
>> Dazu inkludiert der Quellcode das entsprechende Headerfile gmp.h
>
> Leider hat die runtergeladene gmp-5.1.3 keine gmp.h , sondern nur eine
> gmp-h.in .
> Auch eine *.a Datei gibt es nicht.

Dann hast du den Quellcode runtergeladen.

> Das soll auf einen µC.
> Das heißt wohl ich muss den Code kompilieren.

Ja. Was für ein Betriebssystem verwendest du? GMP kommt standardmäßig 
mit Unterstützung für GNU autotools, die wiederum ein unixoides System 
(wenigstens bash, autotools, make) voraussetzen. Also

./configure --help ... und lesen

dann die passenden Optionen für deinen cross-compiler und 
Installationsort verwenden. Anschließend make; make install


XL

von Oliver (Gast)


Lesenswert?

Bei weitem einfacher wäre es, den Quellcode, der gmp.h einbinden will, 
zu verstehen, und rauszufinden, ob man das wirklich auf einen 
Mikrocontroller braucht.

Wenn ja, dann als nächstes die Doku zu gmp lesen, ob der gewünschte 
Prozessor überhaupt unterstützt wird.

Denn gmp enthält Code
"including carefully optimized assembly code for the most common inner 
loops for many different CPUs"

Wenn die eigene CPU nicht zu den "many different" gehört (die 
Wahrscheinlichkeit ist groß", je nun, zurück auf Los, und nochmal 
nachdenken, warum man das braucht. Spätestens an der Stelle reicht die 
Begründung "weil es so in dem irgenwo heruntergeladenen Quellcode steht" 
dann nicht mehr aus.

Oliver

von Butterberger (Gast)


Lesenswert?

Es handelt sich um einen ARM A9.

Ich möchte die Lib aber nur ungern auf das µC-Betriebssystem 
installieren; aus verschiedenen Gründen.

Das heißt, ich muss den Quellcode in mein Projekt kopieren und 
rumfriggeln bis es passt?

von Oliver (Gast)


Lesenswert?

Äh, na ja, probieren kannst du das.

Noch'n Zitat aus der Doku:
"Note that gmp.h is a generated file, and will be architecture and ABI 
dependent. "

Ich wünsche viel Spaß dabei ;)
Immerhin gehören ARMs generell zu den unterstützen Prozessoren.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Butterberger schrieb:
> Das heißt, ich muss den Quellcode in mein Projekt kopieren und
> rumfriggeln bis es passt?

Generell tut man gut daran, wenn man einen Crosscompiler betreiben
will, auf dem Host dann ein spezielles Verzeichnis mit
target-spezifischen Bibliotheken vorzuhalten.  Da hinein würde deine
für den ARM9 konfigurierte und compilierte libgmp gehören.

Auf diese Weise kann man allerlei Krempel für das jeweilige Target
vorhalten; ich habe hier beispielsweise für einen Cross-MinGW32-Compiler
auch eine libelf selbst compiliert.

Ja, da ist typischerweise etwas Handarbeit angesagt, fummeln mit den
Env-Variablen CPPFLAGS, LDFLAGS, CC, CXX beim ./configure und/oder beim
Bauen.

von Butterberger (Gast)


Lesenswert?

Aber ist Xilinx SDK denn kein Cross-Compiler?
SDK erzeugt ELF-Dateien für die entsprechende Architektur.

Das würde dann wieder heißen, daß ich ein neues Projekt mit dem 
kopierten Quellcode erstellen muss?
Oder nicht?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Butterberger schrieb:
> Aber ist Xilinx SDK denn kein Cross-Compiler?

Keine Ahnung, kenne ich nicht.

Aber allein von einem Crosscompiler hast du eben noch keine für deine
Target-Umgebung compilierte Bibliothek (die du ja offenbar für irgendwas
benötigst).

Der Crosscompiler ist nur das Hilfsmittel, wie man aus dem Quellcode
der Bibliothek zu dieser gelangt.

> Das würde dann wieder heißen, daß ich ein neues Projekt mit dem
> kopierten Quellcode erstellen muss?

Da verstehe ich nur Bahnhof.  Ich weiß weder, warum und wofür du da ein
Projekt erstellen willst, noch warum du irgendwelchen Quellcode
kopieren willst.

Vergiss nicht, du bist im GCC-Forum.  Da wirst du eher die Antworten von
den Leuten finden, die dir beschreiben könnten, wie man sowas mit dem
GCC anstellt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Butterberger schrieb:
> Das würde dann wieder heißen, daß ich ein neues Projekt mit dem
> kopierten Quellcode erstellen muss?
> Oder nicht?

Nein, die GMP hat ihr eigenes Build-Framework. Du kannst nicht einfach 
die GMP-Quellen in eine IDE kopieren und übersetzen.

DAS GEHT SO NICHT.

von Axel S. (a-za-z0-9)


Lesenswert?

Johann L. schrieb:
> die GMP hat ihr eigenes Build-Framework. Du kannst nicht einfach
> die GMP-Quellen in eine IDE kopieren und übersetzen.

Naja, er könnte schon. Wenn er wüßte wie. Aber ich habe da wenig 
Hoffnung. Andererseits müssen nach uns ja auch noch Inschenjöre 
kommen...

Butterberger schrieb:
> Aber ist Xilinx SDK denn kein Cross-Compiler?

Das Xilinx SDK ist kein Crosscompiler. Aber es enthält wohl einen 
(vermutlich sogar mehrere) solchen. Sagt zumindest diese Seite:

http://www.xilinx.com/tools/sdk.htm

"Editor, compilers, build tools, ..."

Du mußt jetzt also nur noch herausfinden, wie der Compiler heißt, den 
das Xilinx SDK dir für den A9 auf die Platte geknallt hat. Und dann dem 
GMP Buildsystem (GNU autotools) verklickern, daß es GMP mit diesem 
Compiler bauen soll. Details dazu stehen in der GMP Doku. Details zu dem 
Xilinx-Kram sollte dir Xilinx mitgeliefert haben.


XL

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Axel Schwenke schrieb:
> Und dann dem GMP Buildsystem (GNU autotools) verklickern, daß es GMP mit
> diesem Compiler bauen soll.

env CC=xilinxsdkcrosscompile-cc ./configure

könnte für den Anfang für diesen Part bereits genügen.  Allerdings
fehlt da sicher noch ein --target=arm9 oder sowas, sowie ein
--prefix=/dahin/soll/mein/cross/compile/zeug/gehen.

von Butterberger (Gast)


Lesenswert?

Hallo, ich habe ein bißchen Probleme mit den Cross-Compilieren.
1
./configure --build=i686-pc-mingw32 --host=arm-linux --disable-shared
Ich bin mir nicht sicher, ob das 100% richtig funktioniert hat. Er läuft 
zwar durch, aber die Log macht mich etwas stutzig.
1
configure:3226: checking whether build environment is sane
2
configure:3276: result: yes
3
configure:3325: checking for arm-linux-strip
4
configure:3355: result: no
5
configure:3365: checking for strip
6
configure:3381: found /mingw/bin/strip
7
configure:3392: result: strip
8
configure:3404: WARNING: using cross tools not prefixed with host triplet
9
...
10
./configure: line 5578: arm-linux-gcc: command not found
11
configure:5580: $? = 127
12
failed program was:
13
...

Sieht nicht so gut aus.
Und ein anschließendes MAKE funktioniert auch nicht.
Sind meine Parameter bei ./configure falsch? Ich habe es auch mit
1
--host=arm-xilinx-linux-gnueabi
versucht, weil Xilinx SDK den Befehl
1
arm-xilinx-linux-gnueabi-gcc
benutzt; die Log sieht aber gleich aus.

Weiß jmd Rat?

von Oliver S. (oliverso)


Lesenswert?

Wie löst man solch ein Problem? Mit google....

Wenn du die erste supekte Meldung
> WARNING: using cross tools not prefixed with host triplet

mal nach google kopierst, findet das zeimlich weit oben z.B das hier 
(und noch viel mehr)

http://www.hep.by/gnu/autoconf/Specifying-Target-Triplets.html

Von da aus kannst du dich durcharbeiten...

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Weil das erste configure falsche Werte bestimmt hat, sind diese evtl. 
gechacht worden.  Dann sollte "make distclean" o.ä. helfen. Oder in 
einem separaten Verzeichnis configure starten und dieses komlpett 
entfernen falls das configure schiefgeht.

Evtl. kannst du die cross-Tools auch von hand angeben, etwa über CC 
Umgebungsvariable. Oder frag mal das "configure --help" Orakel.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

AUßerdem willst du das Zeug bestimmt nicht in Systempfade installieren, 
d.h. --prefix will richtig gesetzt werden.

von Butterberger (Gast)


Lesenswert?

Also, arm-xilinx-linux-gnueabi ist bei mir auf dem lokalen Rechner 
vorhanden mit bin, libc und allem pipapo. Das wurde mit den Xilinx Tools 
installiert.

Jetzt muss ich nur noch autoconf dazu kriegen, das als Host Plattform zu 
erkennen.

von Butterberger (Gast)


Lesenswert?

Ich krieg's nicht hin.
1
./configure --build=i686-pc-mingw32 --host=arm-xilinx-linux-gnueabi --disable-shared
Kennt er nicht. (Fehlermeldung wie oben).

Auch das funktioniert nicht:
1
 --host=/absoluterPfad/arm-xilinx-linux-gnueabi
Das wird wohl nicht unter Windows, oder hat noch jemand eine Rat?
Ist die cross-Autoconf unter Linux denn leichter?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Such mal (z.B. per grep) welche gnueabi hosts überhaupt unterst+tzt 
werden, evtl. ist nur ein - zu viel und er will arm-*-gnueabi.

Ansonsten würd ich mich in einr/der GMP Mailing-Liste anmelden und dort 
die Leute fragen, die GMP machen.

Und --host=Pfad kann nicht funktionieren, wüst drauf losproboeren ist 
Zeitverschwendung.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Butterberger schrieb:
> Ich krieg's nicht hin.
>
1
./configure --build=i686-pc-mingw32 
2
> --host=arm-xilinx-linux-gnueabi --disable-shared

Probier mal
1
CC=arm-xilinx-linux-gnueabi-gcc ./configure --build=i686-pc-mingw32 
2
> --host=arm-xilinx-linux-gnueabi --disable-shared

Braucht eine Unix-Shell (z. B. bash).  Wenn du stattdessen mit cmd.exe
arbeiten willst, musst du die env-Variable CC irgendwie vorher setzen.
set CC=arm-xilinx-linux-gnueabi-gcc oder so ähnlich, habe lange kein
cmd.exe mehr gemacht; vielleicht geht das ja aber sogar wie oben,
cmd.exe hat einiges von Unix gelernt.

: Bearbeitet durch Moderator
von Butterberger (Gast)


Lesenswert?

Leider waren die Tipps oben auch nicht erfolgreich.

Ich habe jetzt ein kleines Linux aufgesetz, aber auch hier bräuchte ich 
mal hilfe.
Ich habe den CC als .bin runtergeladen und Junior-Ingenieurs-mäßig 
irgendwas am PATH rumgefuddelt.
1
echo $PATH
2
/home/knoppix/bin:/home/knoppix/xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

Ob das richtig ist, weiß ich nicht.

Aber laufen tut's immer noch nicht...
1
./configure --host=axilinx-2011.09-50-arm-xilinx-linux-gnueabi
2
.././configure: line 504: sed: command not found
3
.././configure: line 503: expr: command not found
4
.././configure: line 504: sed: command not found
5
.././configure: line 518: sed: command not found
6
: error: cannot create .lineno; rerun with a POSIX shell

von Fred (Gast)


Lesenswert?

In Path stehen Verzeichnisse, nicht Dateien!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Butterberger schrieb:
> sed: command not found

Du hast dir offensichtlich wesentliche Teile des PATH entfernt.

Normalerweise erweitert man den lediglich:
1
export PATH=${PATH}:/deine/erweiterung/kommt/hier

Das .bin-Dingsdas scheint (wenn ich das bei Gugel-Code richtig deute)
ein Installer zu sein; den musst du bitteschön erstmal auswickeln,
den kannst du nicht einfach so benutzen.  Im PATH ergänzt du dann das
Verzeichnis, in das der Installer den Krams hin entpackt hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.