用C++ 写了一个动态库,对外的接口函数是C 函数Foo(),Foo() 的实现中调用了用C++ 写的源代码。这个库被两个工程使用,一个C 工程是主要main.c,另一个C++ 工程是main.cpp,编译链接什么的都顺利,但是,执行C 工程的binary 时crash,执行C++工程binary 时不crash并且结果正确。main.c 和 main.cpp 中对动态库接口的使用是完全一样的。动态库工程对外的C 接口文件在最开始和结束的地方是有加下面的宏的:
#ifndef _FOO_H_
#define _FOO_H_
#ifdef __cplusplus
extern "C" {
#endif
// C API goes here
#ifdef __cplusplus
}
#endif
#endif
后来发现,Foo() 函数中调用了一个C++类的成员函数,该函数返回std::string 类型值,即在Foo() 有类似这样的代码
string str = CFooUtil::GetName();
crash在Foo() 函数的最后一句,即return的时候。从callstack看,Foo() 在退出时,要释放局部变量 str,调到了std::string 的析构函数,栈顶几层是这样的:
#0 0x00000036cb4328a5 in