加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

golang通过cgo调用C++程序

发布时间:2020-12-15 04:53:01 所属栏目:百科 来源:网络整理
导读:实现功能:再golang中调用C++生成的动态库.so,以实现一些功能,比如:golang中调用C++调用的opencv库得到的结果 需要的东西: 1:C++使用Makefile编译成的动态库 2:C++文件 3:golang中的调用代码 1:Makefile文件编写: HASH_LIBS += -L./lib -L./ -lopen

实现功能:再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


}


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读