问题:
go调用cpp 函数库,库中抛异常,导致整个进程挂断。
解决方案:
再封装一层c++函数,在其中添加处理异常的代码。
Demo测试
1.cpp库
add.h
int add(int a, int b);
add.cpp
#include <exception>
extern "C"
{
#include "add.h"
}
struct MyException : public std::exception
{
const char *what() const throw()
{
return "C++ Exception";
}
};
int add(int a, int b)
{
throw MyException();
return a + b;
}
编译:g++ -fPIC -shared add.cpp -o libadd.so
2.再封装一层,在wrap.cc中处理异常
wrap.cc
#include <iostream>
#include <string>
#include <vector>
#include <exception>
extern "C"
{
#include "add.h"
#include "./wrap.h"
}
using namespace std;
int addW(int a, int b)
{
int ret = -1;
try
{
ret = add(a, b);
}
catch (exception &e)
{
std::cout << e.what() << std::endl;
}
catch (...)
{
std::cout << "..." << std::endl;
}
std::cout << ret << endl;
return ret;
}
wrap.h
int addW(int a, int b);
3.调用接口
wrap.go
package test
// #cgo LDFLAGS:-L/home/pxf/testgo/test/add -ladd
// #cgo CXXFLAGS:-I/home/pxf/testgo/test/add -std=c++11
/*
#include "wrap.h"
*/
import "C"
import "fmt"
func Add(a, b int) {
fmt.Println(C.addW(C.int(a), C.int(b)))
}
这样就可以在其他地方导入test包,然后使用test.Add(int,int)方法。