本篇内容主要讲解“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, 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++程序的方法”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。