小兔网

下面由golang教程栏目给大家介绍golang怎么通过cgo调用C++程序,希望对需要的朋友有所帮助!

golang通过cgo调用C++程序

实现功能:再golang中调用C++生成的动态库.so,以实现一些功能,比如:golang中调用C++调用的opencv库得到的结果

需要的东西:

1:C++使用Makefile编译成的动态库

2:C++文件

3:golang中的调用代码

1:Makefile文件编写:

HASH_LIBS += -L./lib -L./ -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_img_hash TEST_LIBS += $(HASH_LIBS) -lCImageUtil -lboost_filesystem -lopencv_videoio INCS += -I./include -I ./ CXXFLAGS += $(INCS) -fPIC  -Wall -O2 -std=c++11 TARGET   = -shared -o lib/libCImageUtil.so COMM_SRCS+= opencv_hash.cc scale_image.cc algo.cc md5.cc #COMM_OBJS=$(COMM_SRCS:.cc=.o) main_test : main-test.cc     $(CXX) $(CXXFLAGS) $< -o $@ $(TEST_LIBS)  CImageUtil:     $(CXX) $(CXXFLAGS) $(COMM_SRCS) -o $@ $(HASH_LIBS) $(TARGET) all: CImageUtil main_test

2:所调用的头文件

#pragma once#ifdef __cplusplus extern "C" { #endifvoid calc_phash(const char *str, int len, char* test, int* flag);int scale_image(const char* src, int srclen, char** dist, int* distlen, char* error);#ifdef __cplusplus   } #endif

3:所调用的cpp文件

#include "CImageUtil.h"int scale_image(const char* src, int srclen, char** dist, int* distlen, char* err) {     return 0; }void calc_phash(const char *img, int len, char* phash_result, int* flag) { }

4:再golang中的调用

package common/*#cgo  CFLAGS: -I ../../../ccgo/include/#cgo  LDFLAGS: -L ../../../ccgo/lib/ -lrt -lCImageUtil -lopencv_core -lopencv_highgui -lboost_system -lopencv_imgproc -lopencv_imgcodecs -lboost_filesystem -lopencv_img_hash -lopencv_videoio -lstdc++#include "CImageUtil.h"#include <stdlib.h>*/import "C"//注意这里要空一行。import (    "encoding/json"    "errors"    "fmt"    "shumei/mainif/log"    "shumei/mainif/config"    "strconv"    "strings"    "time"    "unsafe") func (this *ParamsChecker) PhashProcess(ip *ImgParams, imgBytes []byte) error {    st := time.Now().UnixNano()    var phash [32]byte    var flag int = 10    C.calc_phash((*C.char)(unsafe.Pointer(&imgBytes[0])), C.int(len(imgBytes)), (*C.char)(unsafe.Pointer(&phash[0])), (*C.int)(unsafe.Pointer(&flag)))    if flag != 10 {        return errors.New(fmt.Sprintf("ERROR cgo image info wrong: %v", flag))    }    ip.Data["phash_vector"] = phash    return nil} func (this *ParamsChecker) ScaleImage(ip *ImgParams, imgBytes []byte) error {    st := time.Now().UnixNano()    var distimg *C.char    var distlen C.int    var errscale []byte = make([]byte, 256)    defer func() {        if distimg != nil {            defer C.free(unsafe.Pointer(distimg))            distimg = nil        }    }()    code := C.scale_image((*C.char)(unsafe.Pointer(&imgBytes[0])), C.int(len(imgBytes)), &distimg, &distlen, (*C.char)(unsafe.Pointer(&errscale[0])))    distmsgstr := C.GoStringN(distimg, distlen)    if code == 0 && distimg != nil {        imgBytes = []byte(distmsgstr)        ip.Data["img"] = utils.Base64Encode(imgBytes)    } else {        return errors.New("image scale error")    }    return nil}

以上就是golang怎么通过cgo调用C++程序的知识。速戳>>知识兔学习精品课!