Làm cách nào để cài đặt trình biên dịch chéo Raspberry Pi trên máy chủ Linux của tôi?


114

Tôi đang cố gắng biên dịch chéo cho Raspberry Pi hoạt động trên máy Ubuntu của tôi.

Trong những lần thử đầu tiên, tôi đã sử dụng trình biên dịch arm-linux-gnueabi, có sẵn trong kho Ubuntu. Tôi đã làm việc này. Tôi đã có thể xây dựng tất cả các phụ thuộc của mình và sử dụng trình biên dịch chéo trong dự án cmake của mình.

Tuy nhiên, tôi tin rằng tôi nên sử dụng phiên bản hf, vì vậy tôi đã chuyển sang arm-linux-gnueabihf. Sau đó, tôi nhận ra rằng điều này không hoạt động với Raspberry Pi vì nó là armv6.

Sau một số Googling, sau đó tôi tìm thấy chuỗi công cụ được tạo sẵn từ GitHub .

Tôi đã tải chuỗi công cụ xuống, nhưng tôi không thực sự hiểu cách "cài đặt" nó. Tôi đã giải nén các tệp vào thư mục chính của mình. Cấu trúc thư mục trông như thế này:

/gcc-linearo-arm-linux-gnueabihf-raspbian
    /arm-linux-gnueabihf
        /bin
            (contains g++, gcc, etc)
        /lib
            (contains libstdc++ library)
    /bin
        (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
    /lib
        (gcc lib stuff)

Nếu tôi thay đổi thư mục thành thư mục bin INNER, tôi có thể biên dịch chương trình thử nghiệm từ thiết bị đầu cuối mà không gặp bất kỳ sự cố nào.

~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test

Sau đó, tôi đã cố gắng biên dịch một chương trình thử nghiệm trong thư mục bin OUTER, nơi chứa các phiên bản tiền tố của công cụ.

 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ 
 arm-linux-gnueabihf-g++ test.cpp -o test

Tuy nhiên, khi tôi cố gắng sử dụng trình biên dịch ngay bây giờ (từ bên ngoài thư mục bin bên trong), nó không thể tìm thấy thư viện chia sẻ libstdc ++ đi kèm với chuỗi công cụ:

arm-linux-gnueabihf-gcc: error while loading shared libraries: 
libstdc++.so.6: cannot open shared object file: No such file or directory.

Hơn nữa, tôi muốn có thể sử dụng trình biên dịch mà không cần phải điều hướng đến thư mục bin. Vì vậy, tôi đã thử thêm thư mục bin OUTER (vì tôi muốn các phiên bản có tiền tố) và cả hai thư mục lib vào PATH của tôi:

export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib

Tuy nhiên, điều này dẫn đến cùng một lỗi. Tôi nên "cài đặt" chuỗi công cụ như thế nào để tôi có thể sử dụng chuỗi công cụ từ mọi nơi, giống như tôi có thể làm khi tôi sử dụng các trình biên dịch chéo từ kho Ubuntu?


Thử cài đặt --sysroot qua CMAKE_C {XX} _FLAGS để cài đặt dir.
auselen

Tôi đã thử một số đường dẫn khác nhau cho --sysroot, nhưng điều đó không giúp được gì. Tôi thực sự không chắc mình nên chỉ định đường dẫn nào cho sysroot. Xem ở trên về cấu trúc thư mục của chuỗi công cụ. Ngoài ra, một số Google dường như chỉ ra rằng --sysroot không giúp ích gì cho libstdc ++.
pqvst 4/1013

Tôi sẽ thử / gcc-linearo-arm-linux-gnueabihf-raspbian hoặc / gcc-linearo-arm-linux-gnueabihf-raspbian / arm-linux-gnueabihf
auselen 4/1013

hãy truy cập vào đây launcpad.net/gcc-arm-embedded và tải xuống tarball và giải nén. Đặt đường dẫn của bạn đến bin dir ... xong. Hoặc vào Codeourcery.com (bây giờ là mentor graphics) lấy phiên bản lite, unaar / bz, đặt đường dẫn của bạn đến bin dir ... xong.
old_timer

Câu trả lời:


235

Tôi sẽ cố gắng viết bài này như một hướng dẫn cho bạn để bạn có thể dễ dàng làm theo.

LƯU Ý: Hướng dẫn này chỉ hoạt động cho các hình ảnh raspbian cũ hơn. Đối với Raspbian mới hơn dựa trên Debian Buster, hãy xem hướng dẫn sau trong chủ đề này: https://stackoverflow.com/a/58559140/869402

Yêu cầu trước

Trước khi bắt đầu, bạn cần đảm bảo rằng các phần sau đã được cài đặt:

apt-get install git rsync cmake ia32-libs

Hãy biên dịch chéo một chiếc bánh!

Bắt đầu với việc tạo một thư mục trong thư mục chính của bạn được gọi là raspberrypi.

Vào thư mục này và kéo xuống TOÀN BỘ thư mục công cụ mà bạn đã đề cập ở trên:

git clone git://github.com/raspberrypi/tools.git

Bạn muốn sử dụng cái sau trong số 3 cái gcc-linaro-arm-linux-gnueabihf-raspbian, nếu tôi không đọc nhầm.

Vào thư mục chính của bạn và thêm:

export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

đến cuối tệp có tên ~/.bashrc

Bây giờ bạn có thể đăng xuất và đăng nhập lại (tức là khởi động lại phiên đầu cuối của bạn) hoặc chạy . ~/.bashrctrong thiết bị đầu cuối của bạn để nhận phần PATHbổ sung trong phiên đầu cuối hiện tại của bạn.

Bây giờ, hãy xác minh rằng bạn có thể truy cập trình biên dịch arm-linux-gnueabihf-gcc -v. Bạn sẽ nhận được một cái gì đó như thế này:

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/tudhalyas/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.b
 uild/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-
 linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-l
 inux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oort61/crosstool-ng/builds/
 arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fo
 rtran --disable-multilib --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=
 hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08' --with-bugurl=
 https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgom
 p --enable-libssp --with-gmp=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-rasp
 bian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oort61/crosstool-
 ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc
 =/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-
 gnueabihf/build/static --with-ppl=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf
 -raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oort61/cros
 stool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --wi
 th-libelf=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/a
 rm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oort61/crosstool-ng/bui
 lds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --ena
 ble-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gol
 d --with-local-prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-li
 nux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08
 )

Nhưng này! Tôi đã làm điều đó và các libs vẫn không hoạt động!

Chúng tôi vẫn chưa hoàn thành! Cho đến nay, chúng tôi mới chỉ thực hiện những điều cơ bản.

Trong raspberrypithư mục của bạn , hãy tạo một thư mục có tên rootfs.

Bây giờ bạn cần sao chép toàn bộ /lib/usrthư mục vào thư mục mới tạo này. Tôi thường đưa hình ảnh rpi lên và sao chép nó qua rsync:

rsync -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr} $HOME/raspberrypi/rootfs

nơi 192.168.1.PIđược thay thế bằng IP của Raspberry Pi của bạn.

Bây giờ, chúng ta cần viết một cmaketệp cấu hình. Mở ~/home/raspberrypi/pi.cmaketrong trình chỉnh sửa yêu thích của bạn và chèn những thứ sau:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspberrypi/rootfs)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Bây giờ bạn sẽ có thể biên dịch của bạn cmakechương trình chỉ đơn giản bằng cách thêm cờ thêm này: -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake.

Sử dụng một ví dụ cmake hello world :

git clone https://github.com/jameskbride/cmake-hello-world.git 
cd cmake-hello-world
mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake ../
make
scp CMakeHelloWorld pi@192.168.1.PI:/home/pi/
ssh pi@192.168.1.PI ./CMakeHelloWorld

4
Tôi đã làm theo hướng dẫn của bạn từng bước và bây giờ tôi có thể biên dịch mà không gặp bất kỳ lỗi nào. Cảm ơn! Cảm ơn thêm vì đã bao gồm ví dụ cmake.
pqvst

1
Điều này hoạt động tốt cho các dự án đơn giản, nhưng tôi không thể biên dịch chéo dự án CMAKE của mình phụ thuộc vào opencv. Tôi gặp lỗi sau "/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../lib/gcc/arm-linux-gnueabihf/4.7.2/../ .. /../../arm-linux-gnueabihf/bin/ld: warning: libjpeg.so.8, cần thiết bởi /opt/rpi-rootfs/usr/lib/libopencv_highgui.so, không tìm thấy (thử sử dụng -rpath hoặc -rpath-link) ". Cmake dường như cũng chuyển cờ "-Wl, -rpath, / opt / rpi-rootfs / usr / lib" cho trình liên kết
user389238

18
Các ia32-libsgói không có sẵn trên Ubuntu 13.10. Tôi đã sử dụng libc6-i386 lib32z1 lib32stdc++6thay thế.
Ben T

2
Câu trả lời hướng dẫn tuyệt vời! Có một tiền thưởng :)
andrewdotnich

2
Cảm ơn bạn đã hướng dẫn kỹ lưỡng! Bạn vui lòng giải thích tại sao cần sao chép thư mục / lib / usr từ máy pi?
Marcello

14

Xây dựng cho hình ảnh Raspbian Debian Buster mới hơn và ARMv6

Câu trả lời của @Stenyg chỉ hoạt động với các hình ảnh Raspbian cũ hơn. Raspbian được phát hành gần đây dựa trên Debian Buster yêu cầu chuỗi công cụ được cập nhật:

Trong Debian Buster, trình biên dịch gcc và glibc đã được cập nhật lên phiên bản 8.3. Chuỗi công cụ trong git://github.com/raspberrypi/tools.gitvẫn dựa trên phiên bản gcc 6 cũ hơn. Điều này có nghĩa là việc sử dụng git://github.com/raspberrypi/tools.gitsẽ dẫn đến nhiều lỗi biên dịch.

Hướng dẫn này dựa trên câu trả lời @Stenyg. Ngoài nhiều giải pháp khác trên internet, hướng dẫn này cũng hỗ trợ Rasperry Pi (A, B, B +, Zero ) cũ hơn dựa trên CPU ARMv6. Xem thêm: GCC 8 Cross Compiler xuất ra tệp thực thi ARMv7 thay vì ARMv6

Thiết lập chuỗi công cụ

Không có kho lưu trữ git chính thức nào chứa chuỗi công cụ cập nhật (Xem https://github.com/raspberrypi/tools/issues/102 ).

Tôi đã tạo một kho lưu trữ github mới bao gồm các công cụ xây dựng và biên dịch trước cho ARMv6 dựa trên GCC8 và mới hơn:

https://github.com/Pro/raspi-toolchain

Như đã đề cập trong readme của dự án, đây là các bước để lấy chuỗi công cụ. Bạn cũng có thể tự xây dựng nó (xem README để biết thêm chi tiết).

  1. Tải xuống chuỗi công cụ:
wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
  1. Giải nén nó. Lưu ý: Chuỗi công cụ phải ở trong /opt/cross-pi-gccvì nó không độc lập với vị trí.
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
  1. Bạn xong việc rồi! Chuỗi công cụ hiện đang ở/opt/cross-pi-gcc

  2. Tùy chọn, thêm chuỗi công cụ vào đường dẫn của bạn, bằng cách thêm:

export PATH=$PATH:/opt/cross-pi-gcc/bin

đến cuối tệp có tên ~/.bashrc

Bây giờ bạn có thể đăng xuất và đăng nhập lại (tức là khởi động lại phiên đầu cuối của bạn) hoặc chạy . ~/.bashrctrong thiết bị đầu cuối của bạn để nhậnPATHbổ sung trong phiên đầu cuối hiện tại của bạn.

Nhận các thư viện từ Raspberry PI

Để biên dịch chéo cho Raspberry Pi của riêng bạn, có thể có một số thư viện tùy chỉnh được cài đặt, bạn cần tải các thư viện này vào máy chủ của mình.

Tạo một thư mục $HOME/raspberrypi. Trong raspberrypithư mục của bạn , hãy tạo một thư mục có tênrootfs .

Bây giờ bạn cần sao chép toàn bộ /lib/usrthư mục vào thư mục mới tạo này. Tôi thường đưa hình ảnh rpi lên và sao chép nó qua rsync:

rsync -vR --progress -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs

nơi 192.168.1.PIđược thay thế bằng IP của Raspberry Pi của bạn.

Sử dụng CMake để biên dịch dự án của bạn

Để yêu cầu CMake lấy chuỗi công cụ của riêng bạn, bạn cần có một tệp chuỗi công cụ khởi tạo cài đặt trình biên dịch.

Tải tệp chuỗi công cụ này từ đây: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake

Bây giờ bạn sẽ có thể biên dịch các cmakechương trình của mình đơn giản bằng cách thêm cờ bổ sung này: -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmakevà đặt các biến môi trường chính xác:

export RASPBIAN_ROOTFS=$HOME/raspberry/rootfs
export PATH=/opt/cross-pi-gcc/bin:$PATH
export RASPBERRY_VERSION=1
cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/raspberry/Toolchain-rpi.cmake ..

Ví dụ về hello world được hiển thị ở đây: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh


Tôi nhận được thông báo "bỏ qua liên kết biểu tượng không an toàn" trong quá trình rsync. Là nó ổn?
Alexandr Zarubkin

Sẽ ổn thôi. Đó là do --safe-linkslập luận
Stefan Profanter

Thật không may, tôi không thể kiểm tra điều này cho raspi 4, nhưng vì các tệp thực thi từ Raspi cũ hơn cũng có thể thực thi trên Raspi mới hơn, điều này cũng sẽ hoạt động. Nếu ai đó có thể kiểm tra nó, tôi rất vui được cập nhật mô tả
Stefan Profanter

Xin chào @StefanProfanter, làm cách nào để tạo đường dẫn chuỗi công cụ độc lập để đặt nó vào một đường dẫn khác /opt/cross-pi-gcc ?
nass

@nass rất tiếc là không. Tôi không phải là chuyên gia về trình biên dịch chéo. Nếu ai đó có cái nhìn sâu sắc hơn và thông tin về điều này, tôi rất vui được cập nhật repo của mình! Có thể bạn có thể tạo một Câu hỏi Stackoverflow mới.
Stefan Profanter

5

Tôi không thể tải ( x64phiên bản) trình biên dịch để sử dụng sysrootcho đến khi tôi thêm SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)vàopi.cmake .


Tôi có thể chạy ví dụ Hello World mà không có bộ CMAKE_SYSROOT, nhưng khi thử tệp pi.cmake với một dự án sử dụng thư viện được chia sẻ, tôi đã gặp lỗi trình liên kết libstdc ++. So.6 không tìm thấy. Sau khi tôi đặt CMAKE_SYSROOT, mọi thứ đều hoạt động hoàn hảo.
Michael Hilbert

4

Đối với máy chủ Windows, tôi muốn giới thiệu hướng dẫn này :

  • Tải xuống và cài đặt chuỗi công cụ
  • Đồng bộ sysroot với các thư mục RPi của bạn bao gồm / lib
  • Biên dịch mã của bạn
  • Kéo và thả tệp thực thi vào RPi của bạn bằng SmarTTY
  • Chạy nó!

Không hơn không kém!

Các công cụ GNU dựng sẵn có sẵn cho Raspberry, Beaglebone, Cubieboard, AVR (Atmel) và hơn thế nữa


Việc chỉnh sửa kể từ dòng đầu tiên của nội dung câu hỏi là "Tôi đang cố biên dịch chéo cho Raspberry Pi hoạt động trên máy Ubuntu của tôi." và tôi đã làm rõ điều đó trên tiêu đề. Câu trả lời này vẫn được hoan nghênh, nhưng bạn cũng có thể muốn trả lời câu hỏi này tại: raspberrypi.stackexchange.com/questions/27163/… , câu trả lời cụ thể hơn.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4

Bạn cũng có thể sử dụng tiếng kêu . Nó từng nhanh hơn GCC, và bây giờ nó là một thứ khá ổn định. Việc xây dựng tiếng kêu từ các nguồn dễ dàng hơn nhiều ( bạn thực sự có thể uống một tách cà phê trong quá trình xây dựng ).

Nói ngắn gọn:

  1. Nhận mã nhị phân clang (sudo apt-get install clang) .. hoặc tải xuống và xây dựng ( đọc hướng dẫn tại đây )
  2. Gắn các rootfs mâm xôi của bạn (nó có thể là rootfs thực được gắn qua sshfs hoặc một hình ảnh).
  3. Biên dịch mã của bạn:

    path/to/clang --target=arm-linux-gnueabihf --sysroot=/some/path/arm-linux-gnueabihf/sysroot my-happy-program.c -fuse-ld=lld

Theo tùy chọn, bạn có thể sử dụng binutils arm-linux-gnueabihf kế thừa. Sau đó, bạn có thể xóa cờ "-fuse-ld = lld" ở cuối.

Dưới đây là tệp chuỗi công cụ cmake của tôi.

toolchain.cmake

set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# Custom toolchain-specific definitions for your project
set(PLATFORM_ARM "1")
set(PLATFORM_COMPILE_DEFS "COMPILE_GLES")

# There we go!
# Below, we specify toolchain itself!

set(TARGET_TRIPLE arm-linux-gnueabihf)

# Specify your target rootfs mount point on your compiler host machine
set(TARGET_ROOTFS /Volumes/rootfs-${TARGET_TRIPLE})

# Specify clang paths
set(LLVM_DIR /Users/stepan/projects/shared/toolchains/llvm-7.0.darwin-release-x86_64/install)
set(CLANG ${LLVM_DIR}/bin/clang)
set(CLANGXX ${LLVM_DIR}/bin/clang++)

# Specify compiler (which is clang)
set(CMAKE_C_COMPILER   ${CLANG})
set(CMAKE_CXX_COMPILER ${CLANGXX})

# Specify binutils

set (CMAKE_AR      "${LLVM_DIR}/bin/llvm-ar" CACHE FILEPATH "Archiver")
set (CMAKE_LINKER  "${LLVM_DIR}/bin/llvm-ld" CACHE FILEPATH "Linker")
set (CMAKE_NM      "${LLVM_DIR}/bin/llvm-nm" CACHE FILEPATH "NM")
set (CMAKE_OBJDUMP "${LLVM_DIR}/bin/llvm-objdump" CACHE FILEPATH "Objdump")
set (CMAKE_RANLIB  "${LLVM_DIR}/bin/llvm-ranlib" CACHE FILEPATH "ranlib")

# You may use legacy binutils though.
#set(BINUTILS /usr/local/Cellar/arm-linux-gnueabihf-binutils/2.31.1)
#set (CMAKE_AR      "${BINUTILS}/bin/${TARGET_TRIPLE}-ar" CACHE FILEPATH "Archiver")
#set (CMAKE_LINKER  "${BINUTILS}/bin/${TARGET_TRIPLE}-ld" CACHE FILEPATH "Linker")
#set (CMAKE_NM      "${BINUTILS}/bin/${TARGET_TRIPLE}-nm" CACHE FILEPATH "NM")
#set (CMAKE_OBJDUMP "${BINUTILS}/bin/${TARGET_TRIPLE}-objdump" CACHE FILEPATH "Objdump")
#set (CMAKE_RANLIB  "${BINUTILS}/bin/${TARGET_TRIPLE}-ranlib" CACHE FILEPATH "ranlib")

# Specify sysroot (almost same as rootfs)
set(CMAKE_SYSROOT ${TARGET_ROOTFS})
set(CMAKE_FIND_ROOT_PATH ${TARGET_ROOTFS})

# Specify lookup methods for cmake
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# Sometimes you also need this:
# set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# Specify raspberry triple
set(CROSS_FLAGS "--target=${TARGET_TRIPLE}")

# Specify other raspberry related flags
set(RASP_FLAGS "-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")

# Gather and distribute flags specified at prev steps.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CROSS_FLAGS} ${RASP_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CROSS_FLAGS} ${RASP_FLAGS}")

# Use clang linker. Why?
# Well, you may install custom arm-linux-gnueabihf binutils,
# but then, you also need to recompile clang, with customized triple;
# otherwise clang will try to use host 'ld' for linking,
# so... use clang linker.
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld)

2

Tôi không thể biên dịch QT5 với bất kỳ công cụ nào (khá lỗi thời) từ git: //github.com/raspberrypi/tools.git. Tập lệnh cấu hình liên tục bị lỗi với lỗi "không thể xác định kiến ​​trúc" và với các vấn đề lớn về đường dẫn cho các thư mục bao gồm. Điều hiệu quả với tôi là sử dụng chuỗi công cụ Linaro

http://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/runtime-linaro-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz

kết hợp với

https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

Không sửa được các liên kết tượng trưng của sysroot dẫn đến lỗi ký hiệu không xác định như được mô tả ở đây: Lỗi khi xây dựng thư viện Qt cho raspberry pi Điều này đã xảy ra với tôi khi tôi thử tập lệnh fixQualifiedLibraryPaths từ tools.git. Mọi thứ khác được mô tả chi tiết trong http://wiki.qt.io/RaspberryPi2EGLFS . Cài đặt cấu hình của tôi là:

./configure -opengl es2 -device linux-rpi3-g ++ -device-option CROSS_COMPILE = / usr / local / rasp / gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf / bin / arm-linux-gnueabihf- -sysroot / usr / local / rasp / sysroot -opensource -confirm-license -optimized-qmake -reduce-export -release -make libs -prefix / usr / local / qt5pi -hostprefix / usr / local / qt5pi

với / usr / local / rasp / sysroot là đường dẫn của bản sao hệ thống Raspberry Pi 3 Raspbian (Jessie) cục bộ của tôi và / usr / local / qt5pi là đường dẫn của QT được biên dịch chéo cũng phải được sao chép vào thiết bị. Lưu ý rằng Jessie đi kèm với GCC 4.9.2 khi bạn chọn chuỗi công cụ của mình.


2

Câu hỏi ban đầu đã được đăng cách đây khá lâu và trong thời gian đó Debian đã đạt được bước tiến lớn trong lĩnh vực hỗ trợ đa tìm kiếm.

Multiarch là một thành tựu tuyệt vời cho việc biên dịch chéo!

Tóm lại, các bước sau được yêu cầu để tận dụng multiarch cho quá trình biên dịch chéo Raspbian Jessie:

  • Trên máy chủ Ubuntu của bạn, hãy cài đặt Debian Jessie amd64 trong một chroot hoặc một vùng chứa LXC.
  • Bật nhánh kiến ​​trúc nước ngoài.
  • Cài đặt trình biên dịch chéo từ kho công cụ emdebian.
  • Tinh chỉnh trình biên dịch chéo (nó sẽ tạo mã cho ARMv7-A theo mặc định) bằng cách viết tệp thông số kỹ thuật gcc tùy chỉnh.
  • Cài đặt thư viện armhf (libstdc ++, v.v.) từ kho lưu trữ Raspbian.
  • Xây dựng mã nguồn của bạn.

Vì đây là rất nhiều công việc nên tôi đã tự động thiết lập ở trên. Bạn có thể đọc nó ở đây:

Biên dịch chéo cho Raspbian


1

có một IDE CDP Studio có sẵn giúp biên dịch chéo và triển khai khá đơn giản từ cả windows và linux và bạn có thể chỉ cần đánh dấu vào hộp kiểm chuỗi công cụ raspberry trong khi cài đặt. (PS. Nó có hỗ trợ GPIO và I2C nên không cần mã để truy cập chúng)

Bản demo IDE về việc sử dụng mâm xôi ở đây: https://youtu.be/4SVZ68sQz5U

và bạn có thể tải xuống IDE tại đây: https://cdpstudio.com/home-edition

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.