[英]C wrapper for C++ Library, problems with iostream and gcc
我想在C代码中使用此C ++库(并使用gcc编译代码): https : //github.com/fairlight1337/libcflie
为此,我将包装器函数添加到CCrazyflie.h,CCrazyflie.cpp,CCrazyRadio.h和CCrazyRadio.cpp(我要使用的所有函数都在这些文件中):
添加到CCrazyRadio.h:
extern "C"
{
CCrazyRadio* newCCrazyRadio(string strRadioID);
void deleteCCrazyRadio(CCrazyRadio* cr);
int CCrazyRadio_startRadio(CCrazyRadio* cr);
}
添加到CCrazyRadio.cpp:
extern "C"
{
CCrazyRadio* newCCrazyRadio(string strRadioID) {return new CCrazyRadio(strRadioID);}
void deleteCCrazyRadio(CCrazyRadio* cr) {delete cr;}
int CCrazyRadio_startRadio(CCrazyRadio* cr) {if(cr->startRadio()) return 1; else return 0;}
}
对于CCrazyflie.h和CCrazyflie.cpp中的功能,我做了同样的事情。
我可以在C代码中使用包装器,并且在使用g ++进行编译时它们可以工作,但是在使用gcc进行编译时,编译器会抱怨它不知道iostream(包含在C-Crazyflie.h和CCrazyRadio.h中,它们都包含在C-码)。
我这样做对吗? 如何使gcc查找iostream(以及随附的其他C ++库)? 如果需要的话,我很乐意向您展示更多代码,我只是想使文章简短。
在此先感谢您的帮助! 问候,丹尼尔
问题不在于某些人建议的链接程序,也不是包装程序需要使用C ++编译器进行编译(尽管确实如此)。
问题是C文件包含定义包装程序的标头,包装程序函数采用C语言没有的类型-例如字符串。 extern
语句告诉C ++编译器不要弄乱名称,但是不会在合法C内神奇地制作任何东西。
因此,您的包装函数需要定义为采用C类型,因此您的
CCrazyRadio* newCCrazyRadio(string strRadioID);
变成像
CCrazyRadio* newCCrazyRadio(char * radioId);
在newCCrazyRadio内部,您可以根据需要构造一个string
来保存您的radioID。 如果CCrazyRadio
是一门课,那么您仍然会遇到麻烦。 因此,如果只是将其作为某种句柄返回,则可以替换为void*
您仍然需要extern 'C'
。
您还需要确保包含包装函数的标头仅包含C标头文件。 即使gcc(在C模式下)可以找到它们,它们也不包含有效的C代码。 这意味着它不能包含iostream等。
再说一件事,我记得C不了解extern C
语法,因此您可能需要用条件编译块将其包装起来,例如(您需要检查自己的语法)
#ifdef _CPLUSPLUS_ // Check this bit
extern 'C'
{
#endif
//Put your prototype wrappers here
#ifdef _CPLUSPLUS
}
#endif
这基本上意味着只有C ++编译器才能看到extern C
指令。
(更新:由于对该问题的误解,此答案是错误的。尽管如此,评论中的讨论仍然值得考虑)
这不是您要编译的内容,而是您要链接的内容。 用gcc编译的C代码需要与g ++链接才能访问C ++系统库。 如果项目中的任何.so或.lib文件包含C ++代码,则需要与g ++链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.