Comment faire pour compiler CMake pour ARM avec CMake
En bref, je suis en train de faire de la compilation croisée avec CMake CMake, et je ne pense pas que je suis associant les bibliothèques correctement. Ce que je veux faire ne peut pas être possible, mais je serais au moins aimerais savoir pourquoi il n'est pas possible si c'est le cas.
Système: L'hôte est un Linux avec un Cavium PROCESSEUR ARM9. Il est actuellement en cours d'exécution de la version 2.6.24.4 du noyau Linux et Debian 5.0 (Lenny). Mon poste de travail est un De base i5 Ubuntu 12.04 LTS (Precise Pangolin).
Dans l'ensemble, mon but est d'obtenir ROS en cours d'exécution sur la machine Linux. J'ai compiler à partir des sources, plutôt que d'utiliser apt depuis Debian 6.0 (Squeeze) binaires nécessitent support de pouce que le Cavium ne donne pas, et pas beaucoup de paquets nécessaires sont disponibles pour Debian 5.0 (Lenny). J'avais fait des progrès installer les bibliothèques nécessaires, mais quand je suis arrivé à l'étape 1.3.1 et essayé de lancer CMake, j'ai obtenu l'erreur
CMake 2.8 ou supérieur est requis. Vous exécutez la version 2.6.0
Ensuite, j'ai essayé de télécharger et de build CMake 2.8.8 sur la sous Linux, mais c'en était trop pour le système. Lorsque cela a échoué, j'ai téléchargé l'ensemble des outils proposés sur le site internet du fabricant et utilisé le guide de compilation croisée à [www.cmake.org/Wiki/CMake_Cross_Compiling] pour construire le CMake exécutables. Voici ma chaîne de traitement du fichier:
# 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)
Cependant, l'utilisation de la binaire sous Linux donne l'erreur
cmake: /usr/lib/libstdc++..6: la version " GLIBCXX_3.4.14' not found (requis par cmake)
Bien sûr, la bibliothèque n'est pas là:
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
Je n'ai jamais cross-compilé avant, mais je peux voir l'un des deux scénarios qui se passe: le binaire a été créé avec un lien vers une version supérieure de glibcxx sur la machine hôte ou le fabricant de l'ensemble des outils plus modernes que leur image. Je ne sais pas comment faire pour vérifier ce qui se passe ou si quelque chose d'autre se passe que je ne connais pas.
Mon dernier effort en essayant de statiquement à la compilation croisée CMake l'espoir de se débarrasser de l'erreur de couplage avec
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" ..
J'ai eu des erreurs de génération, et que le binaire ne fonctionne pas non plus. J'ai eu:
FATAL: kernel too old
Segmentation fault
J'avais essayer d'installer glibcxx 3.4.14 sous Linux, mais il n'a pas l'air comme il est disponible pour ce processeur.
J'ai essayé de chercher CMake dépendances ou à la configuration système requise et ne peut pas trouver quoi que ce soit. J'ai aussi fait des recherches sur la façon de construire CMake, mais la plupart des recherches s'orientent comment construire d'autres choses avec CMake plutôt que de construire de CMake.
source d'informationauteur tbh
Vous devez vous connecter pour publier un commentaire.
Je ne le cross-compiler beaucoup pour ARM9 appareils utilisant CMake, et en effet on dirait que vous n'êtes pas en les reliant à la même libs que vous avez sur votre périphérique cible. Vous ne devriez pas besoin de construire CMake vous-même pour obtenir ce fait, car elle n'a pas un bon support pour la compilation croisée depuis la version 2.6. Assurez-vous de définir le CMAKE_FIND_ROOT_PATH variable à un chemin où vous avez une copie exacte de la racine du système de fichiers que vous avez sur votre périphérique cible (avec les bibliothèques et les fichiers binaires pré-compilés pour le processeur cible). Cela devrait résoudre votre problèmes.
Au passage, j'aime utiliser crosstool-ng pour la construction de ma compilateurs croisés. C'est vraiment un très bel outil qui vous aide à construire à partir de zéro, j'ai donc essayer de correspondre à la version de compilateur et de la glibc pour ceux à l'origine utilisé pour construire le système de fichiers racine (j'ai l'habitude de commencer avec un système de fichiers racine d' ARMedslackdepuis que j'utilise Slackware pour mon développement de la zone et ARMedslack pour mon BRAS cibles).