2012-10-11 27 views
10

In breve, sto cercando di compilare CMake con CMake e non penso di collegare correttamente le librerie. Quello che voglio fare potrebbe non essere possibile, ma mi piacerebbe almeno sapere perché non è possibile, se è così.Come compilare CMake per ARM con CMake

Sistema: L'host è un Linux box con una CPU Cavium ARM9. Attualmente è in esecuzione la versione 2.6.24.4 del kernel Linux e Debian 5.0 (Lenny). La mia workstation è una Core i5 con Ubuntu   12.04 LTS (Precise Pangolin).

Il mio obiettivo generale è quello di ottenere ROS in esecuzione sulla scatola Linux. Devo compilare dal sorgente piuttosto che usare apt dato che i binari Debian   6.0 (Squeeze) richiedono il supporto del pollice che Cavium non fornisce, e non molti dei pacchetti necessari sono disponibili per Debian   5.0 (Lenny). Avevo fatto progressi nell'installare le varie librerie necessarie, ma quando ho ottenuto il passaggio 1.3.1 e ho provato a eseguire CMake, ho ricevuto l'errore

CMake 2.8 o superiore. Si sta eseguendo la versione 2.6.0

Successivamente ho provato a scaricare e compilare CMake 2.8.8 sulla scatola Linux stessa, ma era troppo per il sistema. Quando ciò non è riuscito, ho scaricato la toolchain suggerita sul sito Web del produttore e ho utilizzato la guida di cross-compiling su [www.cmake.org/Wiki/CMake_Cross_Compiling] per creare gli eseguibili di CMake. Qui è il mio file toolchain:

# 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) 

Tuttavia, l'uso del binario sulla macchina Linux dà l'errore

cmake: /usr/lib/libstdc++.so.6: versione `GLIBCXX_3.4.14 'non trovato (richiesto da cMake)

abbastanza sicuro, la biblioteca non c'è:

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 

Non ho mai eseguito una compilazione incrociata prima, ma posso vedere uno dei due scenari che si verificano: o il binario è stato creato con un collegamento a una versione superiore di glibcxx sulla macchina host o la toolchain del produttore è più moderna della loro immagine. Non so come controllare cosa sta succedendo o se sta accadendo qualcos'altro di cui non so nulla.

mio ultimo sforzo coinvolti cercando di staticamente cross-compilazione CMake per ottenere auspicabilmente eliminare l'errore durante il collegamento con

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

ho ottenuto errori di generazione, e che binario non ha funzionato neanche. Ho ottenuto:

FATAL: kernel too old 
Segmentation fault 

mi piacerebbe provare l'installazione glibcxx 3.4.14 sulla macchina Linux, ma non sembra che sia disponibile per questo processore.

Ho provato a cercare le dipendenze di CMake oi requisiti di sistema e non riesco a trovare nulla. Ho anche cercato su come costruire CMake, ma la maggior parte delle ricerche mostra come creare altre cose con CMOke invece di creare CMake.

risposta

3

Compongo molte compilazioni incrociate per dispositivi ARM9 usando CMake, e in effetti sembra che tu non stia collegando alle stesse librerie libere che hai sul tuo dispositivo di destinazione.Non è necessario creare CMake autonomamente per fare ciò, poiché ha un buon supporto per la compilazione incrociata dalla versione 2.6. Assicurati di impostare la variabile CMAKE_FIND_ROOT_PATH su un percorso in cui hai una copia esatta del filesystem di root che hai sul dispositivo di destinazione (con librerie e binari precompilati per il processore di destinazione). Questo dovrebbe risolvere i tuoi problemi.

Come sidenote, mi piace usare crosstool-ng per creare i miei cross-compilatori. È uno strumento davvero bello che ti aiuta a crearli da zero, quindi cerco di abbinare la versione del compilatore e glibc a quelli originariamente usati per costruire il filesystem di root (di solito inizio con un filesystem di root pronto da ARMedslack, dato che usa Slackware per la mia scatola di sviluppo e ARMedslack per i miei obiettivi ARM).

+1

La mia impressione è che cmake non supporta la compilazione incrociata in quanto non sembra includere il supporto per eseguire i binari per i test di autoconfigurazione sulla piattaforma di destinazione. Ho sbagliato? – schily