将你的代码藏起来 编译静态库¶
作者:陈之敏 时间:2020年08月15日 关键字:csdk、RDA8910、二次开发、编译、静态库 ## 目录
最近听说有的小伙伴看了我的教程后,有一些问题都跑到官方的gitee上面去问去了。导致官方的人没搞懂问的是啥,小伙伴们也没能知道自己想要的答案。给大家造成了困扰,这里我说声抱歉。
既然出现了这个问题,我这里就声明一下,本系列教程所涉及的内容(demo)不是官方的作品。我个人觉得官方的demo内容太多太全,往往都是把一个模块内所有的东西全部放在一起。这样的话对新手不是很友好,阅读起来也比较费劲。我就把官方的部分demo进行相关的简化,并推出教程这样的话可能会对新手朋友们有一定的帮助。
有时候周末闲暇时间我也会加上一些我觉得好玩的模块在里面,这些可能在官方的demo都没有,比如cJSON、PAHO-MQTT、http-client。
这就是官方的代码仓库。
git clone --recursive https://gitee.com/openLuat/Luat_CSDK_Air724U.git
当然各位小伙伴在看本教程时,我建议还是使用我下面提供的仓库比较好,看完之后在迁移到官方的仓库⇧。
git clone --recursive https://gitee.com/chenxiahuaxu/RDA8910_CSDK.git
再看本教程过程中如果遇到了问题,可以在本人的代码仓库下面评论。也可以在本人的博客下面评论。我要是看到的话,并且这个问题在我的能力范围的话我会尽力解答的(非官方,不要对我要求太多哦,要求太多我可能就不管啦)。
一、前言¶
有的小伙伴也许遇到过下面这个问题。就是自己写了一套很好用的库文件,自己用着也很顺手。现在想把它分享出去也给别人用用。但是这个代码库有一部分是利用的别人不开源的代码(正当渠道获得,只是别人不开源),又或者有什么其他的原因,导致这个代码库不便直接公开。
但是又由于自己的助人为乐之心瘙痒,以至于久久不能寐,连续失眠好几天,非常难受。
如果你用的是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二次开发:环境搭建
里面讲了怎么下载
>
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束