繁体   English   中英

C ++库的C包装器,iostream和gcc问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM