宿主机:CentOS 7 64bitlinux
目标硬件平台:raspberry Pi 2B+nginx
GPIO操做库:wiringPigit
宿主机工做主目录:/home/xxxxx/raspberryPigithub
git的安装就不说了。web
进入工做主目录shell
1,下载 树莓官方 交叉编译工具 centos
git clone git://github.com/raspberrypi/tools.gitbash
进入tools/arm-bcm2708/目录网络
若是是32位系统,使用gcc-linaro-arm-linux-gnueabihf-raspbian/bin
curl
若是是64位系统,使用gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin (本例)
把它添加到环境变量:
sudo nano ~/.bashrc (~表示home目录)
把 export PATH=$PATH:$HOME/raspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
添加到文件结尾,保存退出
使用 source ~/.bashrc 使其生效,或者注销/重启
在任意目录下:输入 arm-linux-gnueabihf-gcc -v 若是能够找到编译器,说明OK
返回到工做主目录
2,下载wiringPi (http://wiringpi.com/download-and-install/)
git clone git://git.drogon.net/wiringPi
在宿主机上下载是为了用其头文件,因此不要进入目录 ./build
3,下载本身的开发目录,根据本身的状况
git clone https://git.oschina.net/xxxxx.git
在目标硬件平台上,
同上下载wiringPi到某个目录,而后这里要进入目录去 ./build
这样在 /usr/local/lib 目录下 会生成 libwiringPiDev.so.2.25 和 libwiringPi.so.2.25 (版本号和lib目录位置有差别,能够先find一下)
经过某种方式,把这些lib拷贝到宿主机工做目录上。好比拷贝到 /home/xxxxx/raspberryPi/rpi2Dev/wiringPi_Lib目录下
在宿主机上, 进入到/home/xxxxx/raspberryPi/rpi2Dev/wiringPi_Lib目录下
建立其无版本号的软链接:
ln -s libwiringPi.so.2.25 libwiringPi.so
ln -s libwiringPiDev.so.2.25 libwiringPiDev.so
若是源文件要引用此lib库,则在makefile里面 -L/xxxx/xxxx -lwiringPi, 指定lib的位置
同时,makefile还要指定包含文件的位置, -I 指定到 wiringPi目录
参考makefile和源文件见结尾。
注意:其实理论上第三方的库是能够在宿主机上交叉编译的,并且应该是那样作的。
可是我打开wiringPi的 build看了,也在其目录下找了, 没有相似configure这样的指定工具链的东西,
多是我不懂,反正没搞定。若是谁知道怎么搞,说出来你们分享下。
如上一切搞定后,就能够编码编译了,编译出的bin如何上传到树莓派上,方法就不少了。
说一下个人方法。
由于centos上我有作网络程序的开发,因此有安装nginx.
而后我会把本身生成bin的目录软链接到nginx的web目录下,
这样在树莓派端,使用 curl 等工具就能够下载到可执行文件了。很是方便。
在树莓派上写个下载并执行脚本,很简单的事情。
#make file of raspberri pi,cross CC=arm-linux-gnueabihf-gcc LD=$(CC) TARGET=hello OBJECT=hello.o RASPBERRY_PI_DIR=/home/xxxxx/raspberryPi WIRING_PI_INCLUDE_PATH=$(RASPBERRY_PI_DIR)/wiringPi/wiringPi #此lib是先在 目标平台上生成的 WIRING_PI_LIB_PATH=$(RASPBERRY_PI_DIR)/rpi2Dev/wiringPi_Lib $(TARGET):$(OBJECT) $(LD) -o $(TARGET) $(OBJECT) -L$(WIRING_PI_LIB_PATH) -lwiringPi hello.o:hello.c $(CC) -o hello.o -c hello.c -I$(WIRING_PI_INCLUDE_PATH) clean: rm -f $(TARGET) $(OBJECT) install: #sudo cp /home/xxxx/pi/bin/hello hello #cp -f $(TARGET) /usr/bin;chmod -R 777 /usr/bin/pushServer
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <wiringPi.h> int main(void) { int bright ; printf("System start...\n"); if (wiringPiSetup () == -1) exit (1) ; pinMode (1, PWM_OUTPUT) ; while(1) { for (bright = 0 ; bright < 1024 ; ++bright) { pwmWrite (1, bright) ; delay (1) ; } for (bright = 1023 ; bright >= 0 ; --bright) { pwmWrite (1, bright) ; delay (1) ; } } return 0; }