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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |