次の golang のチュートリアル コラムでは、golang が cgo を通じて C プログラムを呼び出す方法を紹介します。困っている友人の役に立てば幸いです。
golang は、cgo を通じて C プログラムを呼び出します。
実装関数: golang で C によって生成されたダイナミック ライブラリ .so を呼び出して、次のような関数を実現します。 golang で C によって呼び出される opencv を呼び出します。ライブラリで得られた結果
##必要なもの:
##1: Makefile を使用してコンパイルされた C 動的ライブラリ##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 } #endif3: 呼び出される 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 は cgo を通じて C++ プログラムをどのように呼び出しますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。