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?

23
demandé sur jww 2013-09-19 21:03:21

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.

17
répondu gerrit zijlstra 2013-09-19 19:01:51

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

13
répondu vinay hunachyal 2013-09-20 15:52:50

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.

2
répondu Mats Petersson 2013-09-19 17:13:39

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.

1
répondu TwoCode 2013-09-20 03:07:25

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.
1
répondu anaken78 2016-07-30 18:57:47