BeagleBoard-xM - Kompilieren bzw. Übersetzen von C / C++-Programmen

warning: fread(): Length parameter must be greater than 0 in /var/www/elchs-kramkiste.de/lapurd/includes/common.inc(1695) : eval()'d code on line 19.

Um Programme (C++, C usw.), die nur im Quellcode vorliegen und für die es keine Pakete im Software-Repository der entsprechenden Linux-Distribution gibt, lauf- bzw. funktionsfähig (ausführbar) übersetzen zu können, braucht man auf dem PC / System in aller Regel einen entsprechende Kompiler bzw. Compiler (und noch einiges mehr).

Auf einem BeagleBoard-xM (BBxM) wird dies noch dadurch erschwert, dass überwiegend empfohlen wird, Programme, die nur im Quellcode vorliegen, auf einem leistungsfähigen Computer zu übersetzen. Da ein BBxM einen ARM-Prozessor hat, PCs meist aber einen x86-kompatiblen Prozessor haben, sind die auf einem PC kompilierten Programme nicht einfach auf ein BBxM übertragbar (nicht binärkompatibel). Deshalb wäre dafür die Schaffung einer sogenannten "cross-compile-Umgebung" erforderlich.

Nun, das BBxM hat meines Erachtens ausreichend RAM und CPU-Leistung, um diese Arbeiten selbst zu verrichten (auch wenn es etwas länger dauern sollte), zumal das Übersetzen eines Quellcode-Programms (make) nur die 1/2 Miete ist. Es ist ja auch noch an die entsprechende Umgebung anzupassen, was meist vor dem "make" durch den Befehl ./configure (Umgebung ermitteln) und hinterher durch make install erledigt wird. Mein Ziel war also die Schaffung einer entsprechenden Umgebung direkt auf dem BBxM.

Hinweis: Das Folgende bezieht sich auf die Angstrom-Linux-Distribution:


# uname -a


Linux BBxM.mydomain.local 2.6.32 #3 PREEMPT Tue Jul 26 10:56:56 CEST 2011 armv7l GNU/Linux


Erste Versuche mit einem kleinen Quellcode-(Source-)Programm ergaben schon beim einführenden ./configure einen fehlenden "gcc" und


# opkg install gcc
# opkg install g++
# opkg install bison
# opkg install flex
# opkg install ...


führten zu keiner Änderung des Ergebnisses. U.a. wurde von ./configure auch angemerkt, dass evtl. die Umgebungsvariable "CC" nicht existieren bzw. stimmen könnte und tatsächlich, auf die Befehle set sowie env kamen zwar einige gesetzte Environment-Variablen zum Vorschein, aber keine mit dem Schlüssel "CC".

Nachdem ich gesehen habe, dass die C-Kompiler per opkg-Installation nach "/usr/bin" installiert worden sind, habe ich in der Datei "/etc/profile" ziemlich am Anfang eine neue Zeile mit dem folgenden Inhalt eingefügt

CC="/usr/bin"

und nach einem BBxM-Neustart war diese Variable gesetzt (wurde auch nicht mehr als fehlend moniert), dennoch lief das ./configure immer noch nicht durch.

Nach weiteren Internet-Recherchen fand ich die richtige Info: Um das Ziel zu erreichen, musste ich


# opkg install task-native-sdk


ausführen. Da beim erstem Mal viele unaufgelöste Abhängigkeiten aufgelistet wurden, habe ich diesen Befehl noch ein zweites Mal durchgeführt. Dieser 2. Durchgang wurde ohne solche Problemmeldungen durchgeführt.

Danach konnte ich das folgende kleine Testprogramm

#include 
using namespace std;

int main() {
    cout << "BBxM now compiles C++" << endl;
    return 0;
}

welches ich in einer Datei namens "hello.cpp" abgespeichert habe mittels


# g++ -o hello hello.cpp


aber immer noch nicht übersetzen. Es kam zu folgender Fehlermeldung:

/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status

Ursache war ein fehlender Link im Verzeichnis "/lib", also


# cd /lib
# ln -s libgcc_s.so.1 libgcc_s.so


Nun wieder


# g++ -o hello hello.cpp


Keine Fehlermeldungen, also ...


# ./hello


Ausgabe:

BBxM now compiles C++

Nun schien alles vorbereitet für die Kompilierung auch anderer Programme, denn auch das ./configure des eingangs erwähnten Programms lief ohne weitere Fehlermeldungen durch.

Aber dazu später mehr...