[LINUX] Compilation croisée pour Raspberry Pi Zero sur Debian - Créez votre propre bibliothèque partagée

Aperçu

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.

environnement

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.

Ce programme

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

Essayez la compilation croisée

Pour Raspberry Pi Zero

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.

Pour Raspberry Pi 3

Créer un environnement

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)

Construire

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.

Sommaire

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

Compilation croisée pour Raspberry Pi Zero sur Debian - Créez votre propre bibliothèque partagée
Compilation croisée pour Raspberry Pi Zero sur Debian-Try en utilisant une bibliothèque partagée
Démarrage de la compilation croisée pour Raspberry Pi Zero sur Ubuntu
[Python] Enregistrez votre propre bibliothèque dans PyPI
Allumez / éteignez votre PC avec Raspberry Pi
pigpio sur Raspberry pi
Contrôlez les moteurs sans balais avec GPIO de Raspberry Pi Zero
Installez PyCall sur Raspberry PI et essayez d'utiliser la bibliothèque GPIO pour Python de Ruby
Cython sur Raspberry Pi
Exécutez AWS IoT Device SDK for Python sur Raspberry Pi
Accédez aux feuilles de calcul Google en utilisant python avec raspberry pi (pour vous-même)
Introduction de pyenv sur Raspberry Pi
Utilisez NeoPixel avec la tarte aux framboises
Installez OpenCV4 sur Raspberry Pi 3
Installez TensorFlow 1.15.0 sur Raspberry Pi
Créez votre propre plateforme IoT en utilisant raspberrypi et ESP32 (partie 1)
Appelez votre propre bibliothèque partagée en langage C à partir de Python à l'aide de ctypes
Test de la communication UART avec Raspberry Pi
MQTT sur Raspberry Pi et Mac
raspberry pi 4 centos7 installer sur docker
Installez ghoto2 sur Raspberry Pi (Remarque)
Essayez d'implémenter k-NN par vous-même
Réglage initial du Raspberry Pi (pour moi-même)
Essayez d'utiliser ArUco avec Raspberry Pi
Procédure d'installation d'OpenCV sur Raspberry Pi
Allumer / éteindre le Raspberry pi avec Arduino
Détecter l'état du commutateur avec Raspberry Pi 3
Installez OpenMedia Vault 5 sur Raspberry Pi 4
L Chika avec Raspberry Pi C #
Construisez wxPython sur Ubuntu 20.04 sur Raspberry Pi 4
Utilisons le langage de script pour une vie confortable en C ++ 4 - Utilisons la propre bibliothèque de C ++ à partir du langage de script -
Paramètres initiaux pour l'utilisation du kit de démarrage et de la caméra Grove Pi + avec Raspberry Pi