2015-01-12 2 views
3

Я пытаюсь использовать библиотеку C++ в C-среде, реализуя оболочку. Я заметил, что вам нужно объявлять функции как extern «C» в файле заголовка. Однако, когда я пытаюсь связать свою динамическую библиотеку, имя mangling не отключается, что приводит к неопределенным символам, когда я пытаюсь использовать свою обертку.extern «C» не отключает имя mangling

Вот текущий заголовок моей оболочки, SbeOtfDecoder.h:

#ifndef ITF_SBEOTFDECODER_H_ 
#define ITF_SBEOTFDECODER_H_                


// WARNING! In a C++ wrapper for C, any exception thrown by C++ code HAS TO BE CATCHED! 
// Otherwise, it is "undefined behavior". 

#ifdef __cplusplus                  
extern "C" { 
#endif                     
///Create a new SbeOtfDecoder class instance, casted as void * for C code. 
void *SbeOtfDecoder_new_with_file(char *filename); 

///Destroy SbeOtfDecoder class instance. 
void SbeOtfDecoder_free(void *self); 
#ifdef __cpluscplus 
} //extern "C" 
#endif 

#endif /* ITF_SBEOTFDECODER_H_ */ 

и соответствующие функции в SbeOtfDecoder.cpp:

class SbeOtfDecoder 
{ 
public: 
    SbeOtfDecoder(char *filename); 
    ~SbeOtfDecoder(); 
}; 

SbeOtfDecoder::SbeOtfDecoder(char *filename) 
{ 
} 

SbeOtfDecoder::~SbeOtfDecoder() 
{ 
} 

void *SbeOtfDecoder_new_with_file(char *filename) 
{ 
    return new SbeOtfDecoder(filename); 
} 

void SbeOtfDecoder_free(void *self) 
{ 
    delete static_cast<SbeOtfDecoder*>(self); 
} 

Затем связь происходит (в schroot):

g++ -shared ../tmpfs/v7-flux/env/squeeze-32/DEBUG/./libs/itf_sbedecoder/src/Ir.oo ../tmpfs/v7-flux/env/squeeze-32/DEBUG/./libs/itf_sbedecoder/src/Listener.oo ../tmpfs/v7-flux/env/squeeze-32/DEBUG/./libs/itf_sbedecoder/src/SbeOtfDecoder.oo -L../tmpfs/lib -lstdc++ -o ../tmpfs/lib/libitfsbedecoder.so 

Однако символы символов все еще искажены в выходной библиотеке:

nm ../tmpfs/lib/libitfsbedecoder.so | grep SbeOtf 
0001f460 t _GLOBAL__I_SbeOtfDecoder.cpp 
0001f3d8 T _Z18SbeOtfDecoder_freePv 
0001f37f T _Z27SbeOtfDecoder_new_with_filePc 
0001f36e T _ZN13SbeOtfDecoderC1EPc 
0001f368 T _ZN13SbeOtfDecoderC2EPc 
0001f37a T _ZN13SbeOtfDecoderD1Ev 
0001f374 T _ZN13SbeOtfDecoderD2Ev 

Эти символы не могут быть использованы в остальной части рамки C, я в настоящее время аварии на модульное тестирование с этой ошибкой:

~/workspace/v7-flux/build/cunit-32: symbol lookup error: ../tmpfs/v7-flux/env/squeeze-32/DEBUG/cunit/./libs/itf_sbedecoder/cunit//libtest_SbeOtfDecoder_test.so: undefined symbol: SbeOtfDecoder_new_with_file 

Я понятия не имею, что я делаю неправильно. Если вам нужно больше узнать о некоторых этапах компиляции, не стесняйтесь спрашивать. Я не вкладывал больше, так как почти весь процесс компиляции «скрыт» в этой структуре.

+4

Включает ли ваш .cpp-файл оболочку .h? –

+2

'extern" C "отсутствует в определении. – Jarod42

+0

Вы не опубликовали полный пример, показывающий поведение, поэтому мы угадываем здесь, но компилятор должен знать об extern «C», когда он компилирует определения функций, и поэтому вполне вероятно, что вы забыли #include «SbeOtfDecoder .час". –

ответ

6

Реализация должна увидеть объявление extern "C", чтобы подавить манипуляцию, поэтому вам нужно включить заголовок интерфейса в файл .cpp.

+0

Я искал такой ответ, потому что, после догадки, большое спасибо –

Смежные вопросы