我正在尝试使用 cgo 从 dll 运行函数。该库是用 c++ 编写的,所以我在这里创建了一个 C 头文件,其中包含定义的函数和一个.cpp实现的文件。
库.h:
#ifdef __cplusplus
extern "C" {
#endif
void* LoadEngine(char*);
#ifdef __cplusplus
}
#endif
库.cpp:
#include <Engine.h> //the library
void* LoadEngine(char *sn) {
Engine *e;
GetEngineObject(sn, &e); //function from the dll, here it fails
return (void*) e;
}
然后调用它:
package main
/*
#include "lib.h"
*/
import "C"
func main() {
e := C.LoadEngine(C.CString("foobar")
...
}
我有go1.12 windows/amd64 和mingw-w64-posix-seh
也试过mingw-w64-posix-sjlj, mingw-w64-win32-seh, mingw-w64-win32-sjlj, 但结果是一样的, 或者根本不编译
用go buildand 编译它:
#cgo windows CFLAGS: -IC:/Engine/Inc
#cgo windows CPPFLAGS: -IC:/Engine/Inc
#cgo windows LDFLAGS: -LC:/Engine/Bin64 -lEngine -lEngineObj -lole32 -loleaut32 -luuid
我也尝试用 mingw 捕获异常__try1
,__except1
但无论如何它都失败了。尝试了不同的 mingw 版本,使用-ldflags="-linkmode internal"
但是这不会编译并且-ldflags="-linkmode external"
也会出现此异常。
编辑:还尝试从 C 程序调用LoadEngine
函数 (from ),它工作正常。lib.h
编译lib.cpp
为. g++
_ lib.o
并将它链接到test.c
我刚刚调用LoadEngine
just frommain
函数的地方。所以也许有什么不对劲怎么把库链接到cgo?
米琪卡哇伊
相关分类