web-dev-qa-db-fra.com

Comment travailler avec des bibliothèques externes lors de la compilation croisée?

J'écris du code pour Raspberry Pi ARM target on x86 ubuntu machine. J'utilise la chaîne d'outils gcc-linaro-armhf. Je peux croiser la compilation et exécuter des programmes indépendants sur pi. Maintenant , Je veux lier mon code à une bibliothèque externe telle que ncurses. Comment puis-je y parvenir.

Dois-je simplement lier mon programme à la bibliothèque ncurses existante sur la machine hôte, puis l'exécuter sur ARM? (Je ne pense pas que cela fonctionnera) Dois-je obtenir la version source ou précompilée de lib for arm, le mettre dans mon chemin lib 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 cela a fonctionné après une compilation croisée sans rien faire de spécial. Je viens de fournir un chemin pour mon bras gcc dans makefile. Donc, je veux savoir comment il a obtenu des en-têtes et des bibliothèques std corrects?

30
Punit Soni

Concernant vos questions générales:

Pourquoi la bibliothèque C fonctionne:

La bibliothèque C fait partie de votre chaîne d'outils croisée. C'est pourquoi les en-têtes sont trouvés et le programme se lie et s'exécute correctement. Cela est également vrai pour certaines autres bibliothèques système très basiques comme libm et libstdc ++ (pas dans tous les cas, cela dépend de la configuration de la chaîne d'outils).

En général, lorsque vous traitez avec le développement croisé, vous avez besoin d'un moyen d'obtenir la compilation croisée de vos bibliothèques souhaitées. L'utilisation de binaires dans ce cas est très rare. C'est-à-dire, en particulier avec le matériel ARM, car il y a tellement de configurations différentes et souvent tout est supprimé de différentes manières. C'est pourquoi les binaires ne sont pas très compatibles binaires entre différents appareils et configurations Linux. .

Si vous exécutez Ubuntu sur le Raspberry Pi, il est possible que vous trouviez une bibliothèque ncurses appropriée sur Internet ou même dans un référentiel d'aptitudes Ubuntu. La manière typique, cependant, sera de compiler la bibliothèque avec la chaîne d'outils spécifique que vous avez.

Dans les cas où de nombreuses bibliothèques complexes doivent être compilées de manière croisée, il existe des solutions qui facilitent un peu la vie, comme buildroot ou ptxdist. Ces programmes créent des noyaux Linux complets et des systèmes de fichiers racine pour les périphériques intégrés.

Dans votre cas, cependant, tant que vous ne voulez que des ncurses, vous pouvez compiler vous-même le code source. Il vous suffit de télécharger les sources, d'exécuter configure tout en spécifiant votre chaîne d'outils à l'aide de --Host option. Le --prefix L'option choisira le répertoire d'installation. Après avoir exécuté make et make install, considérant que tout s'est bien passé, vous aurez un ensemble d'en-têtes et la bibliothèque ARM compilée pour votre application.

En ce qui concerne la compilation croisée, vous trouverez sûrement beaucoup d'informations sur Internet et peut-être que ncurses a également des pointeurs dans sa documentation livrée.

23
gerrit zijlstra

Pour la requête How the C library works in cross-tools

Lors de la compilation et de la création d'une chaîne d'outils croisés pendant la configuration, ils fourniront sysroot.

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

Ainsi, au lieu de chercher /lib /usr/include, Il cherchera/Toolchain/(libc) et (inclura les fichiers) lors de sa compilation

vous pouvez vérifier par

arm-linux-gnueabihf-gcc -print-sysroot

ce spectacle où chercher libc.

également

arm-linux-gnueabihf-gcc -print-search-dirs

vous donne une image claire

14
vinay hunachyal

De toute évidence, vous aurez besoin d'un ncurses compilé pour le ARM que vous visez - celui sur l'hôte ne vous servira à rien du tout [sauf si votre hôte a un = ARM processeur - mais vous avez dit x86, donc clairement pas le cas].

Il PEUT y avoir des bibliothèques prédéfinies disponibles, mais je soupçonne qu'il est plus difficile d'en trouver une (qui fonctionne et correspond à vos conditions spécifiques) que de construire la bibliothèque vous-même à partir de sources - cela ne devrait pas être si difficile, et je m'attends à ce que ncurses ne prend pas autant de minutes à construire.

2
Mats Petersson

Quant à votre première question, si vous avez l'intention d'utiliser la bibliothèque ncurses avec votre chaîne d'outils de compilateur croisé, vous aurez préparé ses binaires intégrés.

Votre deuxième question est de savoir comment cela fonctionne avec les bibliothèques std, eh bien ce n'est vraiment PAS le système libc/libm que la chaîne d'outils utilise pour compiler/lier votre programme. Vous le verrez peut-être à partir de l'option - - print-file-name = 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 d'outils Raspberry pourrait être la même. Vous pouvez l'essayer.

1
TwoCode

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 pour définir vos rootfs est --sysroot=<dir> et pas --with-sysroot. C'est ce que j'ai trouvé lorsque j'utilisais 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 (version préliminaire) 
 Copyright (C) 2013 Free Software Foundation, Inc. 
 Ceci est un logiciel libre; voir la source pour les conditions de copie. Il n'y a AUCUNE 
 Garantie; même pas pour la QUALITÉ MARCHANDE ou L'ADÉQUATION À UN USAGE PARTICULIER. 
1
anaken78