DIY Electronic projects

Full Version: RPi cross-compile C/C++ za MacOS (x86 -> ARM)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pozdrav svima,

kao sto komplikovani naslov govori radi se o komplikovanoj materiji i nadam se da ce neki iskusan programer da se ukljuci u problematiku.

Sve bi to bilo super i sto je najgore radi na Linuxu, ali meni treba za MacOS i tu nastaje problem sto nema oficialnih toolset-ova za tu platformu i svi kazu da se koristi Clang (koji je sam po sebi crooscompiler) sto donekle nije strasno i mozda proradi sa njim ali ne mogu da ga nateram da povuce sve sto treba jer MORA da se bilduje i linkuje na osnovu postojecih biblioteka i kernela od RPi (skine se sa RPi u lokal na case-sensitive FS) ali stalno nesto kuka da mu fali.

Intereseuje me samo ovo cudo da proradi, dakle najprostiji HelloWorld.cpp ali da se bilduje na macOS (x86) a da radi na RPi ARM Linux, nista vise ne trazim, samo to Smile 

PHP Code:
#include <iostream>

int main() {
 
 std::cout << "Hello world" << std::endl;
 
 return 0;

Nisam kompententan za ovaj problem ali u zelji da pomognem naletih na ovo :
https://www.jaredwolff.com/blog/cross-co...pberry-pi/
https://www.jaredwolff.com/toolchains/
Nemam pojma vise nista .... pogubio sam se skroz a kako i nebi ... : (

ovo je komanda za prevodjenje i to kao radi

Code:
"/Volumes/xtool-build-env/raspbian-sdk/prebuilt/clang+llvm-7.0.0-x86_64-apple-darwin/bin/clang-7" -cc1 -triple armv6kz--linux-gnueabihf -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name hello.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu arm1176jzf-s -target-feature +strict-align -target-abi aapcs-linux -mfloat-abi hard -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=gdb -target-linker-version 409.12 -v -resource-dir /Volumes/xtool-build-env/raspbian-sdk/prebuilt/clang+llvm-7.0.0-x86_64-apple-darwin/lib/clang/7.0.0 -isysroot /Volumes/xtool-build-env/raspbian-sdk/sysroot -I /Volumes/xtool-build-env/sysroot/usr/include -I /Volumes/xtool-build-env/sysroot/usr/include/arm-linux-gnueabihf/ -internal-isystem /usr/local/include -internal-isystem /Volumes/xtool-build-env/raspbian-sdk/prebuilt/clang+llvm-7.0.0-x86_64-apple-darwin/lib/clang/7.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /Volumes/xtool-build-env -ferror-limit 19 -fmessage-length 214 -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/5q/httk5zk11yl6hfhrf5rdhbrh0000gn/T/hello-36b108.o -x c++ hello.cpp -faddrsig

a ovo za linkovanje koja ne radi i tu je haos ...

Code:
"/Volumes/xtool-build-env/host/bin/arm-linux-gnueabihf-ld" --sysroot=/Volumes/xtool-build-env/sysroot -X --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /lib/ld-linux-armhf.so.3 -o a.out /Volumes/xtool-build-env/sysroot/usr/lib/arm-linux-gnueabihf/crt1.o /Volumes/xtool-build-env/sysroot/usr/lib/arm-linux-gnueabihf/crti.o /Volumes/xtool-build-env/sysroot/usr/lib/gcc/arm-linux-gnueabihf/6/crtbegin.o -L/Volumes/xtool-build-env/sysroot/usr/lib/gcc/arm-linux-gnueabihf/6 -L/Volumes/xtool-build-env/sysroot/usr/lib/gcc/arm-linux-gnueabihf/6.3.0 -L/Volumes/xtool-build-env/sysroot/usr/lib/gcc/arm-linux-gnueabihf/6.3.0/../../../../lib -L/Volumes/xtool-build-env/sysroot/lib/../lib -L/Volumes/xtool-build-env/sysroot/usr/lib/../lib -L/Volumes/xtool-build-env/sysroot/usr/lib/arm-linux-gnueabihf/../../lib -L/Volumes/xtool-build-env/sysroot/usr/lib/gcc/arm-linux-gnueabihf/6.3.0/../../.. -L/Volumes/xtool-build-env/sysroot/lib -L/Volumes/xtool-build-env/sysroot/usr/lib /var/folders/5q/httk5zk11yl6hfhrf5rdhbrh0000gn/T/hello-36b108.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /Volumes/xtool-build-env/sysroot/usr/lib/gcc/arm-linux-gnueabihf/6/crtend.o crtn.o -L/Volumes/xtool-build-env/sysroot/usr/lib/arm-linux-gnueabihf/ /Volumes/xtool-build-env/sysroot/usr/lib/arm-linux-gnueabihf/crt1.o

ma bezi ovo je bolesno ....
Jel moze da se pokrene program kompajliran sa Cygwinom na Windowsu, na MacOS?
Pa moze ali to je isti problem kao i kod mene, da bi to preveo i linkovao moras da imas kod sebe kopiju celeog Mac-ovog /usr/lib i /usr/local/lib pa onda includove jer on mora da prevede/linkuje "od kulina bana" sve redom, libc++ pa redom ...

Problem kod mene sto su putanje zabrljane, ne mogu to sve da skockam na gomilu i da se povuce tacno sto treba, mesaju mi se toolsetovi, nesto povuce iz /usr/local (odatle nista ne sme da vuce za croos-compile) a nesto pak povuce iz direktorijuma koju sam mu specificirao da mi je toolchain.
Dobrodošao u klub Sad
Juče sam se "drndao" sa ARM GCC na Linux/Windows...
Nažalost, ne mogu ti konkretno pomoći, ali pitanje je za tebe: da nije možda lakše da instaliraš neku virtelnu mašinu (Virtual Box) i pod njim Linux pa tako?
Ako ti nesto pomaze, imam gcc 4.7 koji radi na Windowsu sa Cygwinom, a kompajlira za ARM.
@npejcic To mi radi, VMware pod MacOS sa Linuxom unutra i toolchain za RPi, ludnica ali radi ...
A to radi zato sto se toolchain podmetne kao default i kada kazes g++ ili ld on skonta “aha za ARM prevodim” i onda povuce sta treba i mislim da onda “zabrlja” ostalo pa ne mozes tu da prevodis za x86 linux osim ako nemas neki tool za “switchovanje” kao sto radi sponenuti croostool-ng ...
Za Android ARM ima jedna bas takva skripta koja exportuje na gomilu tools-ove i biblioteke za target koji izaberes, posebno se uradi za x86 i poebno za ARM i kada se prevodi sve se lepo povuce odatle a na meni je samo da navedem -L i -I do tog foldera prilikom prevodjenja. To radi lepo na svim OS, aliii ja sam na RPi linuxu ne Android linux ... dodje mi da predjem na Android ...
Ja sam probao i za beaglebone i rpi, linux i win i ništa mi nije radilo. Odlepio sam i batalio. Jeste glupo ali to malo što sam radio sa rpi, radio sam direktno na njemu. Možda probam ponovo, prošlo je dovoljno vremena. Nije ti baš neka pomoć.. jbg
Hehe, svako ko je pokusao da uradi cross-compile za RPi je odlepio na kraju ... : )
Meni radi  Tongue Na Linuxu, Linaro ima kompajlirane kompajlere koji vec gledaju svoje putanje u okviru instalacije, samo treba da se pozove odgovarajuci izvrsni fajl iz instalacije ili da se doda u PATH. Slicnih stvari ima i ovde, Ubuntu i Debian imaju u repozitorijumima gcc-arm-linux-gnueabihf, i to radi bez problema za BeagleBone, za NanoPi 32 i 64-bitni uglavnom, pa sto ne bi i za RPi
E ako ti proradilo, proradilo i meni. Tongue

Lepo covek napisao tamo "Before we start anything I recently compiled the toolchain for Rpi3. It will save you a whole bunch of time to download it here rather than go through this proceedure."
https://www.jaredwolff.com/toolchains/

Code:
/Volumes/xtools/armv8-rpi3-linux-gnueabihf/bin/armv8-rpi3-linux-gnueabihf-c++ test.c -o app -O3 -s

ls -la app
-rwxr-xr-x  1 miki  staff  3776 Oct  7 22:23 app

file app 
app: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 4.3.0, stripped

I radi na RPi .... e to je vec napredak Smile
BTW: tamo spominju da se ide na ARM-ov sajt i skine toolchain:
https://developer.arm.com/open-source/gn.../downloads

Medjutim sa njim se opet u isti problem dolazi jer mora da mu se specificira opet sve ovo gore sto sam ja pokusavao i za koji target, i da li ima/nema linux itd.

Toolchain koji sam skinuo sa https://www.jaredwolff.com/toolchains/ je to isto samo sto mu je u izvrsne fajlove (gcc, g++, ld i ostalo) ustvari hardcodovana sva podesavanja tacno za RPi Linux ARM.
Crosstool-ng sluzi da se ti alati tako prevedu i konfigurisu, ali kada sam nasao vec to gotovo ne zalazim tamo dalje ... Smile
Rekoh ti ja. Cool
Vidim da ste se snašli Smile
Hvala @enaB, i ja sam se snašao u međuvremenu, postavio sam ovaj kompajler:
https://developer.arm.com/open-source/gn...ain/gnu-rm

Zatim instalirao ovo:
http://www.mingw.org/

I zanimljivo, meni neočekivao, kada sam uradio "make", kompajler mi je privaljivao grešku za koju sam kasnije shvatio da je inicirana time što nisam kreiro "build" folder u okviru projekta. Nekako sam sledio loguku da će kompajler sve što treba od foldera da kreira... mada kada bolje razmislim, a što bi to on radio Smile
Treba to malo istestirati, povezati par nekih bibliotekica (npr Boost) i onda probati recimo -O3 flag (maximalna optimizacija) ... Kod mene tako cross-preveden program na RPI onda kaze cuveno "Segmentation Fault", bez toga radi!!! Probajte ...
Na RPi kada se prevede isti taj program sa -O3 nemam nikakvih problema, tako daaaaa, nije to sve bas idealno kao sto izgleda .... Ako pocne prevodilac tako da zeza onda od ta posla nema nista, pa ozbiljno ...
Sta bi se tek desilo da sam hteo Buildroot da pokrenem Big Grin
https://buildroot.org

Mislim da pre ovoga treba da proverim da li ima slobodnog mesta u ustanovi "Male Pcelice" posto je tamo guzva velika, ceka se mesto .... Big Grin
Korisni linkovi za cross-compile na *nix za ARM procesore:

Demystifying ARM Floating Point Compiler Options
https://embeddedartistry.com/blog/2017/1...r-options/

Objasnjenje i praktican primer
https://freckled.dev/how-to/2019/07/29/c...scompiler/

Ovo je bitno takodje:
 
arm-none-eabi - This tool chain targets for ARM architecture, has no vendor, does NOT target an operating system and complies with the ARM EABI. 

arm-none-linux-gnueabi - This toolchain targets the ARM architecture, has no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI.