目录
本系列博客所述资料均来自合宙官方
,并不是本人原创(只有博客是自己写的),csdk只是得到了口头的允许公开授权
。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法
。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。
本系列博客基于紫光展锐的RDA8910 LTE Cat 1
bis芯片平台开发。理论上适用于合宙的Air720U、Air724U、广和通L610以及安信可的cat-01模块。
各个厂家的部分配置文件可能不一样,也许会导致设备出现奇怪的问题,其他的模块我也不确定能不能用,自行测试。但是有一点编译下载和监视流程基本一样
,可供参考。
先不管支不支持,如果你用的模块是是紫光展锐的RDA8910,那都不妨一试,也许会有意外收获(也有可能变砖,慎重!!!
)。
我使用的是Air724UG
开发板,如果在其他模块上不能用,那也不要强怼,也许是开发包不兼容吧。这里的代码是没有问题的。例程仅供参考!
一、前言
有的小伙伴也许遇到过下面这个问题。就是自己写了一套很好用的库文件,自己用着也很顺手。现在想把它分享出去也给别人用用。但是这个代码库有一部分是利用的别人不开源的代码(正当渠道获得,只是别人不开源),又或者有什么其他的原因,导致这个代码库不便直接公开。
但是又由于自己的助人为乐之心瘙痒,以至于久久不能寐,连续失眠好几天,非常难受。
如果你用的是CSDK开发,那么现在!这个问题将不复存在。
你猜的没错,我又带着解决办法来了,让你可以有办法将自己的代码库编译成静态库文件,提供给其他人使用。而他又看不到代码,方便了他人也方便了自己。
本篇教程和C语言关系不是很大,主要是CMAKE的相关应用,不会的话也没关系,下面提供代码,直接套工程模板即可。
二、编写各种代码
2.1、工程构建
在demo文件夹中新建一个demo为StaticLibrary
,在StaticLibrary
文件夹内新建一个HelloWorld
文件夹。
在HelloWorld
文件夹内新建一个inc存放头文件、一个src存放源文件、一个lib存放库文件。如果看不懂我讲什么,先去参考一下其他的demo工程。
2.2、编写cmake
将StaticLibrary
文件夹内的cmake文件改成如下内容。主要是根据条件判断是应该编译库文件还是编译工程文件。
if(CONFIG_APPIMG_LOAD_FLASH)
add_appimg({target}{flash_ldscript} demo_StaticLibrary.c)
elseif(CONFIG_APPIMG_LOAD_FILE)
add_appimg({target}{file_ldscript} demo_StaticLibrary.c)
endif()
set(HelloLibGen OFF)
if(HelloLibGen)
add_subdirectory(HelloWorld)
else()
add_definitions(-DHelloBuild)
include_directories(./HelloWorld/inc)
target_link_libraries({target} PRIVATE{PROJECT_SOURCE_DIR}/demo/${BUILD_TARGET}/HelloWorld/lib/libHelloWorld.a)
endif()
将StaticLibrary\HelloWorld
文件夹内的cmake文件改成如下内容。主要是添加源文件路径、添加头文件路径、添加外部头文件路径、生成静态库、指定静态库生成位置。
include_directories(../../../api/include)
include_directories(./inc)
aux_source_directory(./src DIR_SRCS)
add_library(HelloWorld STATIC {DIR_SRCS})
set(LIBRARY_OUTPUT_PATH{PROJECT_SOURCE_DIR}/demo/${BUILD_TARGET}/HelloWorld/lib)
2.3、编写库文件
在inc目录下新增HelloWorld.h
文件并添加如下代码,什么源文件内的函数。
#ifdef HELLO_WORLD_H
#define HELLO_WORLD_H
void HelloFunc();
#endif
在src目录下新增HelloWorld.c
文件并添加如下代码。就做了一件事不停的helloworld
。
#include <stdio.h>
#include "iot_debug.h"
#include "iot_os.h"
#include "HelloWorld.h"
void HelloFunc()
{
for (int n = 0; n < 30; n++)
{
iot_debug_print("[LibHelloWorld]hello world %d", n);
iot_os_sleep(1000);
}
}
2.4、编写用户文件
准备工作就绪后,就要开始编写调用文件了,由于是使用一个demo完成静态库编译和静态库引用两个动作。这两者是不能同时存在的,所以需要加上条件编译。通过HelloBuild宏定义确定当前编译器应该执行什么动作。
/***************
demo_StaticLibrary
****************/
#include "iot_debug.h"
#include "iot_os.h"
#ifdef HelloBuild
#include "HelloWorld.h"
#endif
HANDLE demo_hello_task;
static void demo_hello(PVOID pParameter)
{
#ifdef HelloBuild
HelloFunc();
#endif
iot_os_delete_task(demo_hello_task);
}
int appimg_enter(void *param)
{
iot_debug_print("[hello]appimg_enter");
demo_hello_task = iot_os_create_task(demo_hello, NULL, 1024, 1, OPENAT_OS_CREATE_DEFAULT, "hello");
return 0;
}
void appimg_exit(void)
{
iot_debug_print("[hello]appimg_exit");
}
三、开始编译
以上工作就绪后,就可以开始编译了,有的同学可能还没看完我下面要说的就跑去编译了。那么结果就是编译失败,在网上找半天都找不到解决方案。错误就是找不到库文件!!!
那么这里我要提醒一下,如果是自己新建的工程,在HelloWorld/lib
里面是没有库文件的,需要自己编译
一下库文件才可以编译工程。如果是SDK提供的例程那里面就会有一个库文件可以直接用。
那么问题来了怎么才能编译出来库文件呢。
很简单只要把将StaticLibrary
文件夹内的cmake文件中的set(HelloLibGen OFF)
这一行改成set(HelloLibGen ON)
,然后再去运行编译那么就会在HelloWorld/lib
目录下生成一个静态库libHelloWorld.a
。静态库编译完成之后,就可以将C文件删除了,别人就可以直接用你生成的静态库了,头文件不能删除
。
然后呢,再把set(HelloLibGen ON)
改回set(HelloLibGen OFF)
,最后去编译试试。看看是不是编译成功了。至于那个警告无视它就可以了。
四、下载验证
运行一切正常,没有问题。
不会下载的点击这里,进去查看我的
RDA8910 CSDK二次开发入门教程
专题第一篇博文1、RDA8910CSDK二次开发:环境搭建
里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束