Golang中调用C++程序怎样做,操作是什么
导读:相信很多人对“Golang中调用C++程序怎样做,操作是什么”都不太了解,下面小编为你详细解释一下这个问题,希望对你有一定的帮助 下面由golang教程栏目给大家介绍golang怎么通过cgo调用C++程序,希望对需要的朋友有所帮助!g...
相信很多人对“Golang中调用C++程序怎样做,操作是什么”都不太了解,下面小编为你详细解释一下这个问题,希望对你有一定的帮助下面由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" { #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中调用C++程序怎样做,操作是什么的介绍啦,需要的朋友可以参考上述内容,希望对大家有帮助,欢迎关注网络,小编将为大家输出更多高质量的实用文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Golang中调用C++程序怎样做,操作是什么
本文地址: https://pptw.com/jishu/653229.html