发布时间:2024-12-22 21:28:43
package main
import "C"
//export Hello
func Hello() *C.char {
return C.CString("Hello from Go!")
}
上述代码定义了一个名为"Hello"的函数,该函数返回一个字符串指针。我们使用了"C"关键字使得该函数能够被C/C++调用。需要注意的是,所有与C/C++交互的代码都需要使用这个关键字。go build -buildmode=c-shared -o hello.dll hello.go
上述命令将生成一个名为"hello.dll"的文件,这是我们在Qt中将要调用的动态链接库。#ifndef GOWRAPPER_H
#define GOWRAPPER_H
#include <QObject>
#include <QString>
class GoWrapper : public QObject
{
Q_OBJECT
public:
explicit GoWrapper(QObject *parent = nullptr);
Q_INVOKABLE QString helloFromGo();
};
#endif // GOWRAPPER_H
#include "gowrapper.h"
#include <dlfcn.h>
#include <QDebug>
typedef char* (*Hello)();
GoWrapper::GoWrapper(QObject *parent) : QObject(parent)
{
}
QString GoWrapper::helloFromGo()
{
void* handle = dlopen("./hello.dll", RTLD_LAZY);
if (!handle)
{
qDebug() << dlerror();
return QString("Failed to load Go library. Check if hello.dll file exist.");
}
Hello hello = (Hello) dlsym(handle, "Hello");
char* result = hello();
dlclose(handle);
return QString(result);
}
上述代码中,我们使用了"dlopen"函数来打开动态链接库文件,然后使用"dlsym"函数通过名称获取Go函数的指针并调用。最后,我们使用"dlclose"函数关闭链接库文件。#include <QApplication>
#include "gowrapper.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GoWrapper goWrapper;
QString result = goWrapper.helloFromGo();
qDebug() << result;
return a.exec();
}
在这个例子中,调用"helloFromGo"方法将执行Go函数并返回结果。我们可以使用"qDebug"输出结果以进行测试和调试。