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