2012-10-11 29 views
10

Kurz gesagt, ich versuche CMake mit CMake zu kompilieren, und ich glaube nicht, dass ich Bibliotheken richtig verknüpfe. Was ich tun möchte, ist vielleicht nicht möglich, aber ich würde gerne wissen, warum es nicht möglich ist, wenn das der Fall ist.Wie kompilieren CMake für ARM mit CMake

System: Der Host ist ein Linux box mit einer Cavium ARM9 CPU. Es läuft derzeit die Version 2.6.24.4 des Linux-Kernels und Debian 5.0 (Lenny). Meine Arbeitsstation ist eine Core i5 unter Ubuntu   12,04 LTS (Precise Pangolin).

Mein Gesamtziel ist es, ROS läuft auf der Linux-Box. Ich muss kompilieren von Quelle, anstatt apt seit Debian   6.0 (Squeeze) Binaries benötigen Daumen Unterstützung, die der Cavium nicht geben, und nicht viele der benötigten Pakete sind für Debian   5.0 (Lenny) verfügbar. Ich hatte Fortschritte beim Installieren der verschiedenen benötigten Bibliotheken gemacht, aber als ich zu Schritt 1.3.1 kam und versuchte CMake zu starten, bekam ich den Fehler

CMake 2.8 oder höher ist erforderlich. Sie führen Version 2.6.0

Als nächstes habe ich versucht, CMake 2.8.8 auf der Linux-Box selbst zu downloaden und zu bauen, aber es war zu viel für das System. Als das fehlschlug, lud ich die Toolchain herunter, die auf der Website des Herstellers vorgeschlagen wurde, und benutzte den Cross-Compiling-Leitfaden unter [www.cmake.org/Wiki/CMake_Cross_Compiling], um die ausführbaren CMake-Dateien zu erstellen. Hier ist meine Toolchain-Datei:

# This one is important 
SET(CMAKE_SYSTEM_NAME Linux) 

# Specify the cross compiler 
SET(CMAKE_C_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc) 
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++) 

# Where is the target environment 
SET(CMAKE_FIND_ROOT_PATH /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu) 

# Search for programs in the build host directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 

# For libraries and headers in the target directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Die Verwendung der binären auf der Linux-Box gibt dem Fehler

Cmake: /usr/lib/libstdc++.so.6: Version `GLIBCXX_3.4.14 'nicht gefunden (wird von cmake)

sicher genug, ist die Bibliothek nicht da:

prompt# strings /usr/lib/libstdc++.so.6 | grep GLIBC 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
GLIBCXX_3.4.3 
GLIBCXX_3.4.4 
GLIBCXX_3.4.5 
GLIBCXX_3.4.6 
GLIBCXX_3.4.7 
GLIBCXX_3.4.8 
GLIBCXX_3.4.9 
GLIBCXX_3.4.10 
GLIBC_2.3 
GLIBC_2.0 
GLIBC_2.3.2 
GLIBC_2.1 
GLIBC_2.1.3 
GLIBC_2.2 
GLIBCXX_FORCE_NEW 
GLIBCXX_DEBUG_MESSAGE_LENGTH 

Ich habe noch nie Cross-kompiliert, aber ich kann eines von zwei Szenarien sehen: Entweder wurde die Binärdatei mit einem Link zu einer höheren Version von glibcxx auf dem Hostcomputer erstellt oder die Toolchain des Herstellers ist moderner als ihr Image. Ich weiß nicht, wie ich überprüfen kann, was passiert oder ob etwas anderes passiert, von dem ich nichts weiß.

Meine letzte Anstrengung versuchen, beteiligt statisch CMake Cross-kompilieren hoffentlich loszuwerden des Verbindungsfehlers mit

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" .. 

Ich habe Fehler zu bauen, und die binären entweder nicht funktioniert hat. Ich habe:

FATAL: kernel too old 
Segmentation fault 

Ich würde versuchen, glibcxx 3.4.14 auf der Linux-Box zu installieren, aber es sieht nicht so aus, wie es für diesen Prozessor verfügbar ist.

Ich habe versucht, CMake Abhängigkeiten oder Systemanforderungen zu suchen und kann nichts finden. Ich habe auch gesucht, wie man CMake bauen kann, aber die meisten Suchen ergeben, wie man andere Sachen mit CMake baut, anstatt CMake selbst zu bauen.

Antwort

3

Ich kompiliere viel für ARM9-Geräte mit CMake, und in der Tat sieht das so aus, als ob Sie nicht mit den gleichen Bibliotheken verlinken, die Sie auf Ihrem Zielgerät haben.Sie sollten CMake nicht selbst erstellen müssen, um dies zu tun, da es seit Version 2.6 gute Unterstützung für Cross-Compiling bietet. Stellen Sie nur sicher, dass Sie die Variable CMAKE_FIND_ROOT_PATH auf einen Pfad setzen, auf dem Sie eine genaue Kopie des Root-Dateisystems haben, das Sie auf Ihrem Zielgerät haben (mit für den Zielprozessor vorkompilierten Bibliotheken und Binärdateien). Das sollte deine Probleme lösen.

Als Nebenbemerkung, ich verwende gerne crosstool-ng für den Aufbau meiner Cross-Compiler. Es ist ein wirklich nettes Werkzeug, das Ihnen hilft, sie von Grund auf neu zu erstellen, also versuche ich, die Compiler-Version und glibc mit denen zu vergleichen, die ursprünglich zum Erstellen des Root-Dateisystems verwendet wurden (normalerweise starte ich mit einem vorgefertigten Root-Dateisystem von verwende Slackware für meine Entwicklungsbox und ARMedslack für meine ARM-Ziele).

+1

Mein Eindruck ist, dass CMake Cross-Compiling nicht unterstützt, da es keine Unterstützung für die Ausführung von Binärdateien für Autokonfigurationstests auf der Zielplattform zu enthalten scheint. Liege ich falsch? – schily