在 mbed平台使用 airkiss_cloudapi sdk 过程中碰到问题解决方法

在 mbed平台使用 airkiss_cloudapi 过程中碰到不少问题。问题的根源在于mbed大部分驱动是用c++实现的。c++(在mian.cpp中) 调用 c静态库 

libwxcloud.a 中的函数(airkiss_cloud_loop()),反过来 c静态库 libwxcloud.a 引用c 函数(airkiss_porting.cpp中的ak_socket airkiss_tcp_socket_create()),

再调用c++函数了(airkiss_tcp_socket_create()函数又调用 c++ 类 TCPSocketConnection )。

使用extern "C"修饰符 就可以很好解决这个问题。标记那些是c函数那些是c++函数。

一、程序引用c静态库 libwxcloud.a中的函数。


在这里我使用的w5500 网络模块,其驱动是使用c++。但是 airkiss sdk 是以静态库的形式提供的(libwxcloud.a),而且是c静态库。
在 main.cpp 中调用静态库 libwxcloud.a 中的函数  airkiss_cloud_loop(); 就会提示 

main.cpp:10||undefined reference to `airkiss_cloud_loop()'|


像这种情况可能 没有引用 -wxcloud,或者是引用静态库先后顺序出问题。

但是在这里是 c 编译器 跟c++编译器生成函数的机制不一样,需要 extern "C"修饰符 声明

#include "mbed.h"
#include "EthernetInterface.h"

extern "C" {
#include "airkiss_cloudapi.h"   //标记头文件airkiss_cloudapi.h中的函数是c函数
}

int main() {
    airkiss_cloud_loop();  //在这里调用就不会提示 引用未定义函数,在c静态库 libwxcloud.a 实现
}



二、c静态库 libwxcloud.a反过来引用程序中的函数。


1、用airkiss_porting.c c文件来实现被引用函数。

编译提示:
airkiss_core.c:(.text.airkiss_cloud_loop+0x14)||undefined reference to `airkiss_gettime_ms'|


airkiss_cloudapi 需要我们实现 airkiss_porting.h中的函数。那么问题又来了--c静态库 libwxcloud.a 要引用我们程序中的函数。
那么我们定义 airkiss_porting.c文件来实现函数就可以解决问题
如果实现airkiss_porting.c 使用c实现函数 uint32_t airkiss_gettime_ms() 是可以的解决问题的。
但是我们实现像下面的函数需要使用w5500驱动,它是c++实现的。

ak_socket airkiss_tcp_socket_create();
int airkiss_tcp_connect(ak_socket sock, char* ipaddr, uint16_t port);
int airkiss_tcp_checkstate(ak_socket sock);
int airkiss_tcp_send(ak_socket socket, char*buf, uint32_t len);
那么问题又来了。提示下面的错:
mbed\platform.h|23|fatal error: cstddef: No such file or directory|


我们的c文件又包含c++文件,在 platform.h中包含了<cstddef> c++头文件,所以报错
#include "TCPSocketConnection.h"
#include "airkiss_porting.h"
#define MAX_SOCKET_COUNT 5
TCPSocketConnection *tcp_socket_array[MAX_SOCKET_COUNT]={0,0,0,0,0};
int airkiss_printfImp(const char *fmt, ...)
{
    return-1;
}



2、用airkiss_porting.cpp c++文件来实现被引用函数。


如果实现airkiss_porting.cpp 使用c++实现函数 airkiss_gettime_ms是可以的,但是 c静态库 libwxcloud.a 要引用这些函数的时候是又提示:
airkiss_core.c:(.text.airkiss_cloud_loop+0x14)||undefined reference to `airkiss_gettime_ms'|
又找不到函数的实现,这里我们是实现 c++的airkiss_gettime_ms 函数,所以链接的时候会报错。

#include "TCPSocketConnection.h"		//头文件TCPSocketConnection.h中函数是c++函数
extern "C" {  					//标记下面的函数是c函数
#include "airkiss_porting.h"
#define MAX_SOCKET_COUNT 5
TCPSocketConnection *tcp_socket_array[MAX_SOCKET_COUNT]={0,0,0,0,0};
int airkiss_printfImp(const char *fmt, ...)
{
    return-1;
}
uint32_t airkiss_gettime_ms()
{
     return -1;
}
}


这样就可以解决 c++(在mian.cpp中) 调用 c静态库 libwxcloud.a 中的函数(airkiss_cloud_loop()),
反过来 c静态库 libwxcloud.a 引用c 函数(airkiss_porting.cpp中的ak_socket airkiss_tcp_socket_create()),
再调用c++函数了(airkiss_tcp_socket_create()函数又调用 c++ 类 TCPSocketConnection )。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值