go与c++链接示例

时间:2023-03-09 16:34:53
go与c++链接示例

go lang与c/c++的链接示例:

foo.hpp

//foo.hpp
#ifndef _FOO_HPP_
#define _FOO_HPP_ template<typename T>
T add(const T& lhs,const T& rhs)
{
return lhs+rhs;
} void display(); #endif //_FOO_HPP_

foo.cpp

//foo.cpp
#include "foo.hpp"
#include <iostream> void display()
{
std::cout<<"this message is from foo.cpp -display"<<std::endl;
}

foo_wrap.h

//foo_wrap.h
#ifndef _FOO_WRAP_H_
#define _FOO_WRAP_H_ #ifdef __cplusplus
extern "C" {
#endif //add function family
int add_int_wrap(int lhs,int rhs);
float add_float_wrap(float lhs,float rhs); //display some message
void display_wrap(); #ifdef __cplusplus
}
#endif
#endif //_FOO_WRAP_H_

foo_wrap.cpp

//foo_wrap.cpp
#include "foo_wrap.h"
#include "foo.hpp" //add function family
int add_int_wrap(int lhs,int rhs)
{
return add<int>(lhs,rhs);
}
float add_float_wrap(float lhs,float rhs)
{
return add<float>(lhs,rhs);
} //display
void display_wrap()
{
return display();
}

foo.go

//foo.go
package main // #cgo CFLAGS: -I./
// #cgo LDFLAGS: -L./ libfoo.a -lstdc++
// #include "foo_wrap.h"
import "C"
import "fmt" func main() {
//test add family
//int
var a,b int32 = 1,2
rsi := C.add_int_wrap(C.int(a),C.int(b))
fmt.Printf("C.add_int_wrap(%d,%d)=%d\n",a,b,rsi)
//float
var c,d float32 = 1.3,2.5
rsf := C.add_float_wrap(C.float(c),C.float(d))
fmt.Printf("C.add_int_wrap(%f,%f)=%f\n",c,d,rsf) //display
fmt.Println("message from C:")
C.display_wrap()
}

编译脚本build.sh:

#!/bin/sh
#build c/c++ source code
g++ -c foo.cpp
g++ -c foo_wrap.cpp
ar rcs libfoo.a foo.o foo_wrap.o #build go source code
go build foo.go
./foo