extern" C"没有禁用名称修改

时间:2015-01-12 10:47:45

标签: c++ c linker

我试图通过实现一个包装器在C框架中使用C ++库。我发现你需要将函数声明为extern" C"在头文件中。但是,当我尝试链接我的动态库时,名称修改不会被禁用,当我尝试使用我的包装器时会导致未定义的符号。

这是我的包装器的当前头,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

我不知道我做错了什么。如果您需要更多关于编译阶段的见解,请随时提出。我没有放更多,因为几乎所有的编译过程都是&#34;隐藏&#34;在这个框架中。

1 个答案:

答案 0 :(得分:7)

实现必须看到extern "C"声明以禁止修改,因此您需要在.cpp文件中包含接口标头。