0

我想在我的 C 代码中使用 C++ 库 gloox(openwrt 的 easycwmp 包)。

我使用 openwrt 工具链将 gloox 编译为包:

这是 cpp 文件 gloox.cpp :

#include "gloox.h" 
namespace gloox 
{
  const std::string XMPP_STREAM_VERSION_MAJOR = "1";
  const std::string XMPP_STREAM_VERSION_MINOR = "0";
  const std::string GLOOX_VERSION           = "1.0.11";
  const std::string GLOOX_CAPS_NODE         = "http://camaya.net/gloox";
}
extern "C" const char* gloox_version()
{
  return gloox::GLOOX_VERSION.c_str();
}

头文件 gloox.h :

#ifndef GLOOX_H__
#define GLOOX_H__

#include "macros.h"


extern "C" //--> error: expected identifier or '(' before string constant 
{
  GLOOX_API const char* gloox_version();
}

#endif // GLOOX_H__

当我在 easycwmp 包的 C 代码中包含 gloox.h 时,gloox 包的编译是可以的,我收到此错误:

staging_dir/target-i386_uClibc-0.9.33.2/usr/include/gloox.h:12:8:错误:预期的标识符或字符串常量之前的“(”!!

我用命令编译 libgloox:

make package/libgloox/compile 

然后我用 cmd 编译 easycwmp 包:

make package/easycwmp/compile 

任何帮助表示赞赏

4

2 回答 2

2

extern "C" 是一个 C++ 构造,因此您需要保护您的标头,以便可以在 C 和 C++ 代码中使用它,如下所示:

#ifdef __cplusplus
    extern "C" 
    {
#endif

GLOOX_API const char* gloox_version();

#ifdef __cplusplus
    }
#endif

另请注意,您需要使用 C++ 前端进行链接,即使您的所有代码都是 C,因此请使用 g++ 而不是 gcc 进行链接。

于 2014-11-07T10:33:19.807 回答
0

您不能extern "C"在 C 代码中使用(包括在从 .c 文件使用的 .h 文件中),只能在 C++ 代码中使用。

你需要用它包围它,#ifdef __cplusplus所以它只有在你#include来自 .cpp 文件而不是 .c 文件时才处于活动状态。

#ifdef __cplusplus
extern "C"
#endif
GLOOX_API const char* gloox_version();
于 2014-11-07T10:31:50.620 回答