由于项目需要在多核芯片上跑,所以需要把C代码转成C++代码。我用的SDK是XLINX的petalinux来转换。
总结,就是对C++的类再进行一次封装,比如我现在有一个Person的类,起名为person.cpp,person.h代码如下:
//----person.cpp-----
#include
#include "person.h"
Person::Person(std::string name, int age)
: name_(name), age_(age) {}
/*
* person.h
*
* Created on: Jan 8, 2019
* Author: qq
*/
#ifndef PERSON_H_
#define PERSON_H_
#include
class Person {
public:
Person(std::string name, int age);
~Person() {}
const char *GetName() { return name_.c_str(); }
int GetAge() { return age_; }
private:
std::string name_;
int age_;
};
#endif // PERSON_H_
然后关键的步骤来了,需要再建一个C和C++转换封装的文件。我现在再创建一个wrapper.cpp,对person进行一次封装,其对应的.h和.cpp代码如下:
/*
* wrapper.cpp
*
* Created on: Jan 8, 2019
* Author: qq
*/
#include "person.h"
#include "wrapper.h"
void *call_Person_Create() {
return new Person("Aland", 18);
}
void call_Person_Destroy(void *p) {
delete static_cast(p);
}
int call_Person_GetAge(void *p) {
return static_cast(p)->GetAge();
}
const char *call_Person_GetName(void *p) {
return static_cast(p)->GetName();
}
/*
* wrapper.h
*
* Created on: Jan 8, 2019
* Author: qq
*/
#ifndef SRC_WRAPPER_H_
#define SRC_WRAPPER_H_
#ifndef WRAPPER_H_
#define WRAPPER_H_
#ifdef __cplusplus
extern "C"
{
#endif
void *call_Person_Create();
void call_Person_Destroy(void *);
int call_Person_GetAge(void *);
const char *call_Person_GetName(void *);
#ifdef __cplusplus
}
#endif
#endif // WRAPPER_H_
#endif /* SRC_WRAPPER_H_ */
然后在main.c里面包含wrapper.h就可以调用了C++的相关函数了,main文件如下:
/*
* main.c
*
* Created on: Jan 8, 2019
* Author: qq
*/
#include"wrapper.h"
#include"stdio.h"
int jack() {
void *p = call_Person_Create();
int age = call_Person_GetAge(p);
const char *name = call_Person_GetName(p);
call_Person_Destroy(p); // 记得释放 p
printf("name=%s, age=%d\n", name, age);
}