QT通过静态库调用Go

## 编写Go代码

package main

import(
"fmt"
"C"
)

//export test
func test(str *C.char) {
fmt.Println(C.GoString(str))
}

func main() {}

其中,第八行的注释//export test必不可少,否则无法生成头文件。func main() {}也必不可少,否则无法编译。
生成的头文件会有两种语言各个对应的类型,但注意,在QT中定义GoString类型变量,然后传入Go会偶现Bug,即传入的值为乱码或者另一个字符串的值,可以通过传入char *类型给Go,在Go中利用C.GoString()将*C.char转为Go的string类型避免该Bug。

## 生成静态库文件
命令如下:

go build -ldflags="-w -s" -buildmode=c-archive -o libTest.a test.go

-ldflags=”-w -s”用于去掉debug和符号信息,有利于减小程序文件大小;
-buildmode=c-archive声明构建模式为生成静态库文件;
-o libTest.a用于生成指定名称的静态库文件;
test.go即为我们编写的Go文件。
注意.a文件开头必须是lib,否则QT无法添加该静态库,或者可以生成.lib格式的静态库,.lib文件对命名无此要求。
最终会生成一个.a文件和一个.h文件。

## QT添加库
QT Creator中,在左侧项目目录中,右键项目文件夹,点击添加库,选择外部库,然后选择刚才生成的静态库文件,选择静态库,其余自行设置,完成后,添加刚才生成的头文件到项目,在需要调用Go的源文件内引入头文件。

## 调用Go函数
在需要调用Go函数,例如上述代码中的`test()`函数,代码如下:

QString str=ui->lineEdit->text();
test(const_cast<char *>(str.toStdString.c_str()));

注意,c_str()方法返回的是const char *类型,而Go中需要的是char *类型,所以需要const_cast<char *>进行转换。

Tags: