在 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中的函数。
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 实现
}
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);
那么问题又来了。提示下面的错:
#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;
}
如果实现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;
}
}