golang怎么通过cgo调用C++程序


本文摘自php中文网,作者藏色散人,侵删。

下面由golang教程栏目给大家介绍golang怎么通过cgo调用C++程序,希望对需要的朋友有所帮助!

golang通过cgo调用C++程序

实现功能:再golang中调用C++生成的动态库.so,以实现一些功能,比如:golang中调用C++调用的opencv库得到的结果

需要的东西:

1:C++使用Makefile编译成的动态库

2:C++文件

3:golang中的调用代码

1:Makefile文件编写:

1

2

3

4

5

6

7

8

9

10

11

12

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:所调用的头文件

1

2

3

4

5

#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文件

1

2

3

4

#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中的调用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

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怎么通过cgo调用C++程序的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

go语言标准库之flag

golang的内存泄漏分析

golang lua怎么用

golang一行代码把array/slice转成逗号分隔的字符串

go和golang之间有区别吗?

golang base64字符串的编码和解码

一周 go world 新鲜事

golang读锁有什么用

[系列] go - 常用签名算法的基准测试

golang程序设计——函数

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...