2014-11-07 4 views
0

Я хочу использовать gloox библиотеки C++ в своем C-коде (пакет easycwmp для openwrt).использовать C++ метод в c-программе

компилировать с OpenWRT toolschain в gloox в упаковке:

здесь СРР файл 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__ 

компиляция пакета gloox в порядке , когда я включаю gloox.h в свой код C пакета easycwmp. Я получаю эту ошибку:

staging_dir/target-i386_uClibc-0.9.33.2/usr/include/gloox.h: 12: 8: ошибка: ожидаемый идентификатор или '(' перед строкой! !!

компилировать libgloox с командой:

make package/libgloox/compile 

, а затем компилировать easycwmp пакет с ЦМД:

make package/easycwmp/compile 

любая помощь

+1

Можете ли вы показать нам 'macros.h'? – Sean

+0

От взгляда на это, похоже, вам нужно обернуть всю библиотеку gloox в оболочку C, если вы хотите ее использовать. Я думаю, что лучше написать «C-like» C++, чем выполнять всю работу, необходимую для ее переноса. – molbdnilo

ответ

0

Вы не можете использовать extern "C" в коде C (в том числе в файле .h, который используется из файла .c), только в коде на C++.

Вам необходимо его окружить #ifdef __cplusplus, так что он активен только в том случае, если вы #include это файл .cpp, а не файл .c.

#ifdef __cplusplus 
extern "C" 
#endif 
GLOOX_API const char* gloox_version(); 
+0

при компиляции main.c Я получил ошибку undefined ссылку на 'gloox_version ' –

2

ехЬегп «C» является C++ построить, так что вам нужно, чтобы защитить свой заголовок, поэтому он может быть использован как из C и C++ код следующим образом:

#ifdef __cplusplus 
    extern "C" 
    { 
#endif 

GLOOX_API const char* gloox_version(); 

#ifdef __cplusplus 
    } 
#endif 

Также обратите внимание, что вам нужно ссылку с использованием интерфейса C++, даже если весь ваш код C, поэтому используйте g ++ для связывания вместо gcc.

+0

при компиляции main.c Я получил ошибку неопределенной ссылки на' gloox_version' –

+0

@Anis_Stack Затем вы сделали что-то не так. Расскажите, что вы сделали: какие команды вы используете. Как вы создали свою библиотеку. Как вы связались в этой библиотеке. – nos

+0

Я компилирую библиотеку goolx с помощью openwrt toolschain «toolchain-i386_gcc-4.6-linaro_uClibc-0.9.33.2» и с помощью «--mode = link i486-openwrt-linux-uclibc-g ++». После компиляции я включаю gloox.h в мою программу на языке C –