Comment travailler avec les bibliothèques externes lors de la compilation croisée?
j'écris du code pour la cible de Raspberry pi ARM sur la machine ubuntu x86. J'utilise la chaîne d'outils gcc-linaro-armhf. Je suis capable de compiler et exécuter des programmes indépendants sur pi. Maintenant, je veux relier mon code avec une bibliothèque externe telle que ncurses. Comment puis-je y parvenir.
est-ce que je dois juste relier mon programme avec le lib ncurses existant sur la machine hôte et ensuite courir sur ARM? (Je ne pense pas que cela va fonctionner) Ai-je besoin d'obtenir la version source ou prébuilt de lib pour arm, mettez-le dans mon chemin de vie et puis compiler?
Quelle est la meilleure pratique dans ce genre de situation?
je veux aussi savoir comment cela fonctionne pour le c stdlib. Dans mon programme j'ai utilisé les fonctions stdio et il a fonctionné après compilation croisée sans rien faire de spécial. Je viens de fournir le chemin pour mon bras gcc dans makefile. Donc, je veux savoir, comment il est devenu des têtes et des libs de MST correctes?
5 réponses
concernant vos questions générales:
Pourquoi la bibliothèque C fonctionne:
la bibliothèque C fait partie de votre chaîne d'outils. C'est pour cela que les en-têtes sont trouvés et que le programme fonctionne correctement. Cela est également vrai pour d'autres bibliothèques système très basiques comme libm et libstdc++ (cela ne dépend pas dans tous les cas de la configuration de la chaîne d'outils).
en général, lorsqu'il s'agit de cross-development, vous avez besoin d'un moyen pour obtenir les bibliothèques souhaitées. L'utilisation de binaires dans ce cas est très rare. C'est-à-dire, surtout avec le matériel ARM, parce qu'il y a tellement de configurations différentes et souvent tout est démonté de différentes façons. C'est pourquoi les binaires ne sont pas vraiment compatibles entre différents périphériques et configurations Linux.
si vous utilisez Ubuntu sur le Raspberry Pi, il est possible que vous trouviez une bibliothèque ncurses appropriée sur internet ou même dans un dépôt apt Ubuntu. Le typique la façon, cependant, sera de croiser la compilation de la bibliothèque avec la chaîne d'outils spécifique que vous avez.
dans les cas où beaucoup de bibliothèques complexes doivent être compilées il y a des solutions qui rendent la vie un peu plus facile comme buildroot ou ptxdist. Ces programmes construisent des noyaux Linux complets et des systèmes de fichiers racine pour les périphériques embarqués.
Dans votre cas, cependant, aussi longtemps que vous voulez ncurses, vous pouvez compiler le code source vous-même. Vous avez juste besoin de télécharger les sources, exécuter configure
en spécifiant votre chaîne d'outils en utilisant le --host
option. --prefix
option choisira le répertoire d'installation. Après l'exécution de make
et make install
, considérant que tout s'est bien passé, vous disposez d'un ensemble d'en-têtes et les BRAS-bibliothèque compilé pour votre demande de lien contre.
en ce qui concerne la compilation croisée, vous trouverez sûrement des tas d'informations sur internet et peut-être que ncurses a aussi quelques pointeurs dans sa documentation expédiée.
Pour la requête How the C library works in cross-tools
lors de la compilation et de la construction de la chaîne cross-tool durant la configuration, ils fourniront systroot.
--with-sysroot=${CLFS_CROSS_TOOLS}
--with-sysroot
--with-sysroot=dir
Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.
Donc au lieu de chercher /lib /usr/include
il regardera / Toolchain/(libc) et (include files) lors de sa compilation
vous pouvez vérifier par
arm-linux-gnueabihf-gcc -print-sysroot
ce spectacle où chercher de la libc .
aussi
arm-linux-gnueabihf-gcc -print-search-dirs
vous donne une image claire
Clairement, vous aurez besoin d'un ncurses
compilé pour le bras que vous ciblez - celui de l'hôte ne vous fera absolument aucun bien [à moins que votre hôte n'ait un processeur ARM - mais vous avez dit x86, donc clairement pas le cas].
il peut y avoir quelques bibliothèques prébuilt disponibles, mais je soupçonne que c'est plus du travail pour en trouver une (qui fonctionne et correspond à vos conditions spécifiques) que de construire la bibliothèque vous - même à partir de sources-ça ne devrait pas être si dur, et j'attends ncurses
ne pas ça prend autant de minutes à construire.
en ce qui concerne votre première question, si vous avez l'intention d'utiliser la bibliothèque ncurses avec votre chaîne de compilation croisée, vous aurez préparé ses binaires arm-built.
votre deuxième question Est de savoir comment cela fonctionne avec std libs, et bien ce n'est vraiment pas le système libc/libm que la chaîne d'outils utilise pour compiler/lier votre programme est. Vous verrez peut-être de --imprimer-nom de fichier= option de votre compilateur:
arm-none-linux-gnuabi-gcc --print-file-name=libm.a
...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a
arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so
...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so
je pense que votre chaîne à framboise pourrait être la de même. Vous pouvez essayer cela.
la réponse de Vinay est assez solide. Juste une correction lors de la compilation de la bibliothèque ncurses pour raspberry pi l'option de définir vos rootfs est --sysroot=<dir>
et non --with-sysroot
. C'est ce que j'ai trouvé lorsque j'ai été en utilisant le compilateur suivant:
arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (prerelease) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.