spark 的博客

Generated by GitHub Pages.

Follow me on GitHub
2019-10-22 15:23:41 +0800

树莓派交叉编译使用文档

假设用户为ac,HOME目录为/home/ac

  1. 下载交叉编译工具链

    • 在HOME目录下创建projects文件夹并进入
    • git clone git://github.com/raspberrypi/tools.git
  2. 选择编译器

    • 克隆完成在projects下会有一个tools文件夹
    • 进入tools/arm-bcm2708文件夹下,有五个不同的编译器
      • arm-bcm2708hardfp-linux-gnueabi
      • arm-bcm2708-linux-gnueabi
      • arm-linux-gnueabihf -> arm-rpi-4.9.3-linux-gnueabihf
      • arm-rpi-4.9.3-linux-gnueabihf
      • gcc-linaro-arm-linux-gnueabihf-raspbian
      • gcc-linaro-arm-linux-gnueabihf-raspbian-x64
    • 选择arm-rpi-4.9.3-linux-gnueabihf编译器,进入bin目录,使用arm-linux-gnueabihf-g++编译程序
  3. 创建软链接到编译工具,并加入环境变量(可跳过,直接使用编译器的绝对路径)

    • 在HOME目录下创建bin文件夹并进入
    • ln -s /home/ac/projects/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ arm-g++
    • 运行echo $PATH,若/home/ac/bin在环境变量里,跳到第4步,否则继续
    • 回到HOME目录并运行vim .bashrc(或者其他文本编辑器)在末尾加入
    • export PATH="/home/ac/bin:$PATH"
    • 保存文件并运行source .bashrc
  4. 测试环境

    • 此时环境已配置完成,编写简单的a.cpp文件,直接执行arm-g++ a.cpp即可生成可执行程序a.out,拷贝到树莓派输入./a.out即可执行
    • 若文件未生成,即为环境配置有问题,若拷贝到树莓派不能执行,可能树莓派的架构和编译器不匹配,tools里有其他架构编译器
  5. 编写Makefile文件

    • 指定Makefile文件的CC变量,CC = arm-g++
    • 若未加入环境变量,CC = /home/ac/projects/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
    • 其他选项和普通Makefile编写一样,注意链接库也要是arm版本的,以下代码可供参考,注意,务必将四个空格替换为Tab
    CC = arm-g++
    #CFLAGS = -Wall -g -O -fPIC -D_DEBUG
    CFLAGS = -Wall -g -O -fPIC -std=c++11
    INCLUDE = -I../SickToolBox/include/laser_node -I./ -I./capture -I../build/include -I../build/include/activemq-cpp-3.9.4 -I../build/include/apr-1
    LIBRARYS = -L../SickToolBox/src -lSick -pthread -L../build/lib -lapr-1 -lactivemq-cpp
    OBJS = capture.o utils.o UDPClient.o ActiveMQWrapper.o
    
    all:$(OBJS)
        $(CC) $(CFLAGS) capture/main.cpp $(OBJS) $(LIBRARYS) -o main.out
    
    $(OBJS):$(SRCS)
        $(CC) $(CFLAGS) $(INCLUDE) -c capture/capture.cpp -o capture.o
        $(CC) $(CFLAGS) $(INCLUDE) -c capture/utils.cpp -o utils.o
        $(CC) $(CFLAGS) $(INCLUDE) -c capture/UDPClient.cpp -o UDPClient.o
        $(CC) $(CFLAGS) $(INCLUDE) -c capture/ActiveMQWrapper.cpp -o ActiveMQWrapper.o
    
    .PHONY:clean
    clean:
        -rm *.o
        -rm *.out
    
  6. make

    • 执行make all
    • 拷贝可执行程序和库到树莓派