golang通过cgo调用C++程序

golang通过cgo调用C++程序,第1张

概述本文章向大家介绍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" {


#endif

voID 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,char* err) {



  return 0;


}

voID calc_phash(const char *img,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


*/


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])),&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++程序全部内容,希望文章能够帮你解决golang通过cgo调用C++程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存