Ceci est une suite de ces articles.
Créez une bibliothèque partagée simple et un programme qui appelle la bibliothèque partagée sur Debian (de VirtualBox sur Windows 10) et exécutez-la sur Raspberry Pi.
Hôte: Debian 10.6.0 <Virtual Box 6.1 <WIndows10 Cible: Raspberry Pi 3 modèle A +
Dernière fois est passé de Raspberry Pi Zero à Raspberry Pi 3. La raison en est que la compilation croisée de Raspberry Pi Zero pour le processeur de la série ARM v6 n'a pas bien fonctionné.
Le Raspberry Pi 3 pour les processeurs de la série ARM v8 est passé facilement.
Cela ressemble à un bogue dans le compilateur, mais si quelqu'un sait ce qui ne va pas, faites-le moi savoir.
Il n'y a rien à l'intérieur, mais le programme d'essai ressemble à ceci.
test_so_lib.h
#ifndef TEST_SO_LIB_H
#define TEST_SO_LIB_H
void print_hoge (int num);
#endif
test_so_lib.c
#include <stdio.h>
#include "test_so_lib.h"
void
print_hoge (int num)
{
int i;
for (i = 0; i < num; i++) {
printf("hogehoge\n");
}
}
main.c
#include "test_so_lib.h"
int
main (void)
{
print_hoge(5);
return 0;
}
Si vous construisez ceci normalement et que vous l'exécutez, cela ressemble à ceci.
$ gcc -shared test_so_lib.c -o libtestso.so
$ gcc test_so_main.c -o test_so_main -I./ -L./ -Wl,-rpath=./ -ltestso
$ ./test_so_main
hogehoge
hogehoge
hogehoge
hogehoge
hogehoge
Une brève histoire sur le mauvais Raspberry Pi Zero ... L'environnement de construction est comme indiqué dans Dernier article. Cela ressemble à ceci dans cet environnement ...
Debian
$ arm-linux-gnueabi-gcc -march=armv6 -shared test_so_lib.c -o libtestso_armv6.so
$ arm-linux-gnueabi-gcc -march=armv6 test_so_main.c -o test_so_main_armv6 -I./ -L./ -Wl,-rpath=./ -ltestso_armv6
Copiez test_so_main_armv6, libtestso_armv6.so de la construction vers Raspberry Pi Zero et exécutez-le.
RaspberryPiZero
$ ./test_so_main_armv6
./test_so_main_armv6: error while loading shared libraries: libtestso_armv6.so: cannot open shared object file: No such file or directory
J'ai une erreur. Il semble que la bibliothèque partagée libtestso_armv6.so est introuvable. Je ne sais pas pourquoi.
Utilisez le compilateur croisé pour armhf pour créer la série ARM v8 de Raspberry Pi 3. Dans Dernier article, l'endroit où «armel» est écrit est corrigé en «armhf» et cela ressemble à ceci.
installation du compilateur croisé armhf
$ sudo apt install crossbuild-essential-armhf
Ajout d'architecture
$ sudo dpkg --add-architecture armhf
$ sudo nano /etc/apt/sources.list
/etc/apt/sources.list
deb [arch=armel,armhf] http://ftp.jp.debian.org/debian buster main
Je n'utilise pas armel cette fois, mais si vous voulez utiliser les deux, vous devriez écrire comme ça.
$ sudo apt update
$ sudo apt install libusb-dev:armhf
$ sudo apt install libjpeg-dev:armhf
Au fait, cette fois, je n'utiliserai que ma propre bibliothèque partagée, donc je n'ai besoin que d'installer crossbuild-essential-armhf
.
(J'ai écrit mon propre mémo jusqu'à présent)
L'architecture spécifiée par «-march» est «armv8-a».
(Il semble que armv8
ne puisse pas être spécifié)
Debian
$ arm-linux-gnueabihf-gcc -march=armv8-a -shared test_so_lib.c -o libtestso_armv8a.so
$ arm-linux-gnueabihf-gcc -march=armv8-a test_so_main.c -o test_so_main_armv8a -I./ -L./ -Wl,-rpath=./ -ltestso_armv8a
Copiez le build test_so_main_armv8a et libtestso_armv8a.so dans Raspberry Pi 3 et exécutez-le.
RaspberryPi3
$ ./test_so_main_armv8a
hogehoge
hogehoge
hogehoge
hogehoge
hogehoge
Il bougeait facilement.
Je l'ai construit pour armv6
avec arm-linux-gnueabi-gcc
et j'étais inquiet pendant un moment car il ne fonctionnait pas avec Raspberry Pi Zero, mais c'est la même chose pour armv8-a
avec arm-linux-gnueabihf-gcc
Quand je vois qu'il est construit selon la procédure et fonctionne facilement, je me demande si arm-linux-gnueabi-gcc
lui-même est un peu suspect.
Il y a peut-être des options requises au moment de la construction ou un manque d'environnement, mais je n'étais pas sûr, alors faites-le moi savoir si quelqu'un peut le comprendre.
Recommended Posts