您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“golang通過cgo調(diào)用C++程序的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“golang通過cgo調(diào)用C++程序的方法”吧!
實(shí)現(xiàn)功能:再golang中調(diào)用C++生成的動(dòng)態(tài)庫.so,以實(shí)現(xiàn)一些功能,比如:golang中調(diào)用C++調(diào)用的opencv庫得到的結(jié)果
需要的東西:
1:C++使用Makefile編譯成的動(dòng)態(tài)庫
2:C++文件
3:golang中的調(diào)用代碼
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:所調(diào)用的頭文件
#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:所調(diào)用的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中的調(diào)用
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 }
到此,相信大家對(duì)“golang通過cgo調(diào)用C++程序的方法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。