golang生成.a文件被C调用遇到的坑

golang二维码扫描:

代码:https://github.com/tuotoo/qrcode

安装:go get github.com/tuotoo/qrcode
(首先必须设置环境变量GOPATH的路径)

tuotoo/qrcode代码调试:

package main
import (
    "github.com/tuotoo/qrcode"
    "log"
    "os"
)
func main() {
    logger := log.New(os.Stdout, "[bar]", log.Lshortfile|log.Ldate|log.Ltime)
    fi, err := os.Open("qrcode.png")
    if err != nil {
        logger.Println(err.Error())
        return
    }
    defer fi.Close()
    qrmatrix, err := qrcode.Decode(fi)
    if err != nil {
        logger.Println(err.Error())
        return
    }
    logger.Println(qrmatrix.Content)
}

go build tuotoo-qrcode.go 会生成可执行文件./tuotoo-qrcode

logger是日志输出的是标准库库包,如
log.New(os.Stdout, "[bar]", log.Lshortfile|log.Ldate|log.Ltime)

生成.a文件(.h文件也会自动生成)

创建文件pkgqrcode.go

package main

import "C"

import (
    //"fmt"
    "github.com/tuotoo/qrcode"
    "os"
)

//export GetQrcodeString
func GetQrcodeString(cstring *C.char) *C.char {
    //func GetQrcodeString() *C.char {
    path := C.GoString(cstring)
    //path := "qrcode.png"
    fi, err := os.Open(path)
    if err != nil {
        //fmt.Println(err.Error())
        return C.CString(path)
    }
    defer fi.Close()
    qrmatrix, err := qrcode.Decode(fi)
    if err != nil {
        //fmt.Println(err.Error())
        return C.CString(path)
    }
    //fmt.Println(qrmatrix.Content)
    //return C.Cstring(qrmatrix.Content)
    gostr := qrmatrix.Content
    cstr := C.CString(gostr)
    return cstr
}

func main() {
}
  • import "C" 的作用就是go代码中使用C函数
  • 需要加//export GetQrcodeString 才会生成.h文件(不知道什么!!)
  • C.GoString(cstring) 把C字符串转成go字符串
  • C.CString(gostr) 把go字符串转成C字符串

编译步骤
生成.a文件命令(进入pkgqrcode.go代码目录)执行:

go build -buildmode=c-archive -o pkgqrcode.a pkgqrcode.go

生成结果
pkgqrcode.a
pkgqrcode.h

C代码调用.a文件

创建文件c-qrcode.c

#include 
#include "pkgqrcode.h"

void reverse(char *str)
{
    printf("%s\n", str);
    char *ret = GetQrcodeString(str);
    //printf("%s\n",ret); 
}
int main(int argc, char const *argv[])
{
    reverse((char *)argv[1]); 
    return 0;
}

编译步骤

gcc c-qrcode.c pkgqrcode.a -o c-qrcode

生成可执行文件
c-qrcode
执行结果(qrcode.png二维码内容是http://www.baidu.com)

./c-qrcode qrcode.png 
qrcode.png
http://www.baidu.com

遇到问题:
在macOS编译生成的pkgqrcode.a文件和在linux平台编译不能互用(估计是系统内核问题)

参考文章:
http://www.cnblogs.com/magicsoar/p/7002467.html
https://studygolang.com/articles/7128

你可能感兴趣的:(golang生成.a文件被C调用遇到的坑)