Forum: Mikrocontroller und Digitale Elektronik Wie C++ Datein übersetzen mit arm-none-eabi-g++ (Kommandozeile)


von Daniel F. (franken_3)


Lesenswert?

Hallo,

ich versuche schon den ganzen Vormittag, nachdem ich unter Windows mit 
EM-Blcoks erfolgreich ein C++ Projekt für den STM32F4 erstellt habe, 
diese Quelldatein unter Linux mit dem arm-none-eabi-g++ zu übersetzen.

Reine C-Datein werden übersetzt, es kommt nur zu Problemen beim 
einbinden der Standard-Header. Gibt es dafür eine spezielle Option, 
damit er die C++ Standard-Bibliotheken verwendet?

Hier die Ausgabe der Konsole

$ arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard 
-mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions 
test.cpp
test.cpp:2:18: fatal error: vector: No such file or directory
 #include <vector>
                  ^
compilation terminated.


Wäre dankbar falls jemand hier weis, was ich falsch mache.

Gruß

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Daniel Eck schrieb:
> Wäre dankbar falls jemand hier weis, was ich falsch mache.
Du rufst den C-Compiler "arm-none-eabi-gcc" auf. Rufe den C++ Compiler 
auf mit "arm-none-eabi-g++".
Du übergibst außerdem kein Linkerscript und keine Startupcode-Datei. Das 
Kompilat wirst du nicht sinnvoll nutzen können...

: Bearbeitet durch User
von Daniel F. (franken_3)


Lesenswert?

Hallo,

macht leider keinen Unterschied
1
arm-none-eabi-g++ -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions test.cpp -T stm32f407vg_sram.ld -T stm32f407vg_flash.ld

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Zwei Linkerscripte? Sicher dass das richtig ist?

Welchen arm-none-eabi-g++ verwendest du? Mit dem von 
https://launchpad.net/gcc-arm-embedded geht das, da wird die <vector> 
Datei mitgeliefert.

von Dani (Gast)


Lesenswert?

[code

arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 4.9.3 20141119 
(release) [ARM/embedded-4_9-branch revision 218278]
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.


[/code]

habe den Compiler über apt installiert (Ubuntu) , da ich mit dem 
Download der einzelnen Dateien leider nichts zum laufen bekommen habe.

Gibt es da etwa Probleme mit dieser Version.

Zu <vector> -> Es gehen auch alle anderen Standard-Bibliotheken nicht, 
diese sind entweder nicht aktiviert oder vielleicht auch nicht 
installiert?? Mir fehlt da bisher noch etwas an Erfahrung, vielleicht 
hatte ja jemand schon mal das gleiche Problem.

Danke schon mal.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Dani schrieb:
> habe den Compiler über apt installiert (Ubuntu) , da ich mit dem
> Download der einzelnen Dateien leider nichts zum laufen bekommen habe.

Die Linux-Version von https://launchpad.net/gcc-arm-embedded 
funktioniert wunderbar unter Ubuntu und enthält alle Dateien der C++ 
Standard Library. Sie wird von vielen Projekten hier im Forum 
erfolgreich verwendet. Falls du ein 64bit-Linux hast, musst du nur das 
Paket "libc6:i386" installieren, damit das funktioniert.

von Dani (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> Falls du ein 64bit-Linux hast, musst du nur das
> Paket "libc6:i386" installieren, damit das funktioniert.

Ach so. OK, dann werde ich mich da gleich mal dran machen.

Vielleicht kurz zur Erklärung, entpacken und die Files sind dann direkt 
ausführbar? Hab da in dem Paket bisher keine Libs gesehen? Oder stellt 
das Betriebssystem die std-libs?

Danke

von Daniel F. (franken_3)


Lesenswert?

Muss mich korriegieren, es ist alles im tar.gz file enthalten. Nur wie 
imlementiere ich das jetzt sauber in mein Ubuntu-System rein?

Danke

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Indem du die "PATH" Umgebungsvariable so setzt dass die das "bin" 
Verzeichnis vom arm-none-eabi-gcc enthält, z.B. so:

Eine Datei ~/.profile anlegen, und hineinschreiben
1
source /etc/profile
2
export PATH=/pfad/zum/gcc-arm-embedded/bin:$PATH

Dann ausloggen und wieder einloggen oder neustarten.

von Daniel F. (franken_3)


Lesenswert?

Danke erstmal.

Habe mir jetzt das Paket von Launchpad geholt, habe es entpackt, die 
PATH-Variable erweitert. Soweit funktioniert das auch. Nun bekomme ich 
aber, wenn ich ein Test-Programm übersetzen möchte folgende Ausgabe:
1
~/ramdisk$ arm-none-eabi-g++ -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -Os -flto -Wl,--gc-sections -static prog.cpp 
2
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-exit.o): In function `exit':
3
exit.c:(.text.exit+0x16): undefined reference to `_exit'
4
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-abort.o): In function `abort':
5
abort.c:(.text.abort+0xa): undefined reference to `_exit'
6
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-fstatr.o): In function `_fstat_r':
7
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
8
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
9
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
10
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-signalr.o): In function `_kill_r':
11
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
12
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-signalr.o): In function `_getpid_r':
13
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
14
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-writer.o): In function `_write_r':
15
writer.c:(.text._write_r+0x10): undefined reference to `_write'
16
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-closer.o): In function `_close_r':
17
closer.c:(.text._close_r+0xc): undefined reference to `_close'
18
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-isattyr.o): In function `_isatty_r':
19
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
20
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-lseekr.o): In function `_lseek_r':
21
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
22
/home/sean/armToolchain/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-readr.o): In function `_read_r':
23
readr.c:(.text._read_r+0x10): undefined reference to `_read'
24
collect2: error: ld returned 1 exit status


Testprogramm ist dieses hier
1
#include <vector>
2
#include <iostream>
3
#include <deque>
4
5
using namespace std;
6
7
class test
8
{
9
  public:
10
  int test;
11
  public:
12
     void setTest(int i) { this->test = i;}
13
};
14
15
int main(void)
16
{
17
   test *obj = new test;
18
   obj->setTest(5);
19
   cout << "Test: " << obj->test << endl;
20
21
   return 0;
22
}

Weis jemand was ich da falsch mache?

Die Optionen habe ich mir hier aus dem Forum geholt

http://www.mikrocontroller.net/articles/ARM_GCC


Danke schon mal, komme leider hier einfach nicht weiter...

von drama (Gast)


Lesenswert?

Wenn du die Standardausgabe verwendest, musst du dem Compiler auch 
sagen, wohin die Ausgabe umgeleitet wird, z.B. auf eine UART. Dafür 
musst du die Funktionen _write usw. implementieren. 
Standardimplementierungen für _kill, _sbrk etc. holst du dir mit dem 
Flag -specs=nosys.specs ins Haus.

von Daniel F. (franken_3)


Lesenswert?

Super Danke, so funktioniert es jetzt:
1
arm-none-eabi-g++ -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -Os -flto -Wl,--gc-sections -static --specs=nosys.specs prog.cpp

Jetzt geht es mal daran ein MakeFile zu bauen.

Danke nochmals

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Dani schrieb:
> Vielleicht kurz zur Erklärung, entpacken und die Files sind dann direkt
> ausführbar? Hab da in dem Paket bisher keine Libs gesehen? Oder stellt
> das Betriebssystem die std-libs?

Installier doch einfach das Launchpad PPA ganz normal mit apt-get, warum 
so umständlich?

von Daniel F. (franken_3)


Lesenswert?

Bernd K. schrieb:
> Dani schrieb:
>> Vielleicht kurz zur Erklärung, entpacken und die Files sind dann direkt
>> ausführbar? Hab da in dem Paket bisher keine Libs gesehen? Oder stellt
>> das Betriebssystem die std-libs?
>
> Installier doch einfach das Launchpad PPA ganz normal mit apt-get, warum
> so umständlich?

Du meinst über die Ubuntu-Paketquellen?? Ich verstehe nicht ganz was du 
meinst.

von Bernd K. (prof7bit)


Lesenswert?

Daniel Eck schrieb:
> Bernd K. schrieb:
>> Dani schrieb:
>>> Vielleicht kurz zur Erklärung, entpacken und die Files sind dann direkt
>>> ausführbar? Hab da in dem Paket bisher keine Libs gesehen? Oder stellt
>>> das Betriebssystem die std-libs?
>>
>> Installier doch einfach das Launchpad PPA ganz normal mit apt-get, warum
>> so umständlich?
>
> Du meinst über die Ubuntu-Paketquellen?? Ich verstehe nicht ganz was du
> meinst.

Ja. Wie bei jedem anderen PPA auch:

https://launchpad.net/gcc-arm-embedded
> Pre-built GNU toolchain from ARM Cortex-M & Cortex-R processors
> (Cortex-M0/M0+/M3/M4/M7, Cortex-R4/R5/R7).
> [...]
> For Ubuntu 10.04/12.04/13.04 32/64-bit user, PPA is available at
> https://launchpad.net/~terry.guo/+archive/gcc-arm-embedded.

Also folge dem Link im letzten Absatz: Füge das PPA das dort angegeben 
ist als Paketquelle hinzu. Also so wie dort beschrieben, ich zitier mal 
die obige Webseite:
1
Here are quick steps to install toolchain from this PPA on Ubuntu before 14.04:
2
3
Step1: Inside Ubuntu, open a terminal and input
4
       "sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded"
5
6
Step2: Continue to input
7
       "sudo apt-get update"
8
9
Step3: Continue to input to install toolchain
10
       "sudo apt-get install gcc-arm-none-eabi"
11
12
[...]
13
14
!!! If you are using Ubuntu 14.04 and later, please be careful because
15
there are packages with same name but produced by Debian and inherited by
16
Ubuntu. Simply follow the above 3 steps, you may end up with 
17
gcc-arm-none-eabi from Ubuntu. So to install gcc-arm-none-eabi from ARM,
18
steps are:
19
1). sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
20
2). sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded
21
3). sudo apt-get update
22
4). sudo apt-get install gcc-arm-none-eabi=4.9.3.2014q4-0trusty12
23
    or
24
    sudo apt-get install gcc-arm-none-eabi=4.9.3.2014q4-0utopic12
25
26
Meanwhile we are working with Debian to consolidate and unify this toolchain.

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.