Dies ist eine Fortsetzung dieser Artikel.
Erstellen Sie eine einfache gemeinsam genutzte Bibliothek und ein Programm, das die gemeinsam genutzte Bibliothek unter Debian (von VirtualBox unter Windows 10) aufruft und auf Raspberry Pi ausführt.
Host: Debian 10.6.0 <Virtual Box 6.1 <Windows10 Ziel: Himbeer Pi 3 Modell A +
Letztes Mal wurde von Raspberry Pi Zero auf Raspberry Pi 3 geändert. Der Grund dafür ist, dass die Kreuzkompilierung von Raspberry Pi Zero für die CPU der ARM v6-Serie nicht gut funktioniert hat.
Die CPUs der Raspberry Pi 3 für ARM v8-Serie bestanden problemlos.
Es klingt wie ein Fehler im Compiler, aber wenn jemand weiß, was los ist, lassen Sie es mich bitte wissen.
Es ist nichts drin, aber das Testprogramm sieht so aus.
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;
}
Wenn Sie dies normal erstellen und ausführen, sieht es so aus.
$ 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
Eine kurze Geschichte über den schlechten Raspberry Pi Zero ... Die Build-Umgebung ist in Letzter Artikel dargestellt. In dieser Umgebung sieht es so aus ...
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
Kopieren Sie test_so_main_armv6, libtestso_armv6.so vom Build nach Raspberry Pi Zero und führen Sie es aus.
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
Ich habe einen Fehler bekommen. Es sieht so aus, als ob die gemeinsam genutzte Bibliothek libtestso_armv6.so nicht gefunden werden kann. Ich bin mir nicht sicher warum.
Verwenden Sie den Cross-Compiler für armhf, um die ARM v8-Serie von Raspberry Pi 3 zu erstellen. In Letzter Artikel wird die Stelle, an der "armel" geschrieben ist, auf "armhf" korrigiert und sieht so aus.
Installation des Armhf Cross Compilers
$ sudo apt install crossbuild-essential-armhf
Hinzufügung von Architektur
$ 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
Ich benutze diesmal keinen Armel, aber wenn Sie beide verwenden möchten, sollten Sie so schreiben.
$ sudo apt update
$ sudo apt install libusb-dev:armhf
$ sudo apt install libjpeg-dev:armhf
Übrigens werde ich dieses Mal nur meine eigene gemeinsam genutzte Bibliothek verwenden, daher muss ich nur "crossbuild-essential-armhf" installieren. (Ich habe bisher mein eigenes Memo geschrieben)
Die von -march
angegebene Architektur ist armv8-a
.
(Es scheint, dass "armv8" nicht angegeben werden kann)
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
Kopieren Sie die Builds test_so_main_armv8a und libtestso_armv8a.so nach Raspberry Pi 3 und führen Sie sie aus.
RaspberryPi3
$ ./test_so_main_armv8a
hogehoge
hogehoge
hogehoge
hogehoge
hogehoge
Es bewegte sich leicht.
Ich habe es für "armv6" mit "arm-linux-gnueabi-gcc" gebaut und war eine Weile besorgt, weil es mit Raspberry Pi Zero nicht funktioniert hat, aber mit "arm-linux-gnueabihf-gcc" ist es dasselbe für "armv8-a" Wenn ich sehe, dass es gemäß dem Verfahren erstellt wurde und leicht funktioniert, denke ich, dass "arm-linux-gnueabi-gcc" selbst ein wenig verdächtig ist.
Möglicherweise sind zum Zeitpunkt der Erstellung einige Optionen erforderlich, oder die Umgebung reicht nicht aus, aber ich bin mir nicht sicher. Bitte lassen Sie mich wissen, wenn jemand davon weiß.
Recommended Posts