溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

golang通過cgo調(diào)用C++程序的方法

發(fā)布時(shí)間:2021-06-17 15:12:40 來源:億速云 閱讀:399 作者:chen 欄目:編程語言

本篇內(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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI