arduino使用第三静态库

为了在arduino中让自已的代码为保密状态,打算使用arv的gcc打包一个静态库放到arduino的IDE下让自已的用户使用。在网上找了一些资料,经过自已实际测试,可以实现这个功能。

本人在mac系统下测试,测试代码如下:

hello.h头文件

#ifndef HELLO_TEST_H 
#define HELLO_TEST_H 

int add1(int t); 
 
#endif

hello.c实现文件

#include "hello.h"
int add1(int t) { 
 
        int x = t+1;
        return x;
}

在linux系统下使用gcc测试主文件main.c

#include 
#include "hello.h" 
 int main() 
 { 
    int tmp = 1;
     tmp = add1(tmp); 
     printf("tmp is %d!\n", tmp);
     return 0; 
 }

linux系统编译可执行文件测试库

#假如当前已经CD到上边三个文件所在路径下
#编译hello.o目标文件
gcc -c hello.c 
#编译main.o目标文件
gcc -c main.c
#生成可执行test文件测试程序
gcc -o test main.o hello.o
#运行test查看程序运行结果
./test
#这时可以看到程序运行强果正常

生成.a库后再测试

先删除上边测试时生成的所有.o,.a和test文件,后再使用下边指令生成.a库和使用.a库生成test可执行文件

#生成.o目标文件
gcc -c hello.c
#生成静态库
ar rcs libhello.a hello.o
#这时会生成libhello.a文件
#生成测试
gcc -o test main.c -L. -lhello
#运行test查看结果是否正常
./test

编译arduino的.o和.a库

在mac系统下,arduino的avr处理器工具链在下的路径下

#arv-g++工具路径:
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-g++
#arv-g++-ar工具路径:
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc-ar

我们要编译arduino的.a库只会用到这两个工具,还有别的工具也在这个目录下,实际使用时如果用的到可以在这里找到

编译.o目录文件

因为arduino在编译时真对不同处理器和不同时钟晶振全有不同的编译参数,这个参数可以在正常编译代码时在IDE下边看到,直接复制出来就好
编译hello.c文件

/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -I/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino -I/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/variants/eightanaloginputs /Users/ttt/Documents/test/hello.c -o /Users/ttt/Documents/test/hello.o

这时会在相应.c目录下生成arduino处理器的.o目录文件
使用.o文件生成.a静态库文件

/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc-ar rcs /Users/ttt/Documents/test/hello.a /Users/ttt/Documents/test/hello.o

这时.a文件就生成了

修改arduino的make配置文件

为了在我们点击arduino IDE的编译或者上传按钮时IDE可以正确加载我们生成的.a库并成功连接生成hex的预烧写文件,我们要修改arduino的make配置文件,这个配置文件在mac系统下的路径如下:

/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/platform.txt

打开这个文件,找到recipe.c.combine.pattern开头的那行在{object_files}后边加上上边编译好的.a文件路径

#/Users/ttt/Documents/test/hello.a 
#加好的样子像下边这样
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" {object_files} /Users/ttt/Documents/test/hello.a  "{build.path}/{archive_file}" "-L{build.path}" -lm

使用IDE运行编译程序

在点IDE的编译或者下载按钮前,先要把hello.h文件放到你的arduino项目下,并在项目中使用

#include "hello.h"

预加载.h头文件
弄好之后,记得要重启一下arduino IDE让.h文件生效,然后编译就OK了

你可能感兴趣的:(arduino使用第三静态库)