标签:
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
标签:
原文地址:http://www.cnblogs.com/xylc/p/4418037.html