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?
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
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.
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?
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.
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
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
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?
Ä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
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.
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?
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.
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.
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
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.
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
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.
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.
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.
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.
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.
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.