首页后端开发其他后端知识Golang中调用C++程序怎样做,操作是什么

Golang中调用C++程序怎样做,操作是什么

时间2024-03-26 03:28:03发布访客分类其他后端知识浏览388
导读:相信很多人对“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
otstrap中如何实现关闭按钮样式,代码是什么 Golang的interface怎么理解,用法是什么

游客 回复需填写必要信息