问题描述
嗨,我正在尝试为其他程序构建一个 dll 插件
我发现在 golang 中可以做一些事情,但在 cpp 中很难做到
我想要一个单个 dll 包含所有内容
环境
Windows 10 amd64
go 版本 go1.16.4 windows/amd64
gcc 版本 8.1.0 (x86_64-win32-seh-rev0,由 MinGW-W64 项目构建)
VisualStudio 2019
第一次尝试
将 gcc 输出与 msvc 链接
//wrapper.c
#include <stdio.h>
__declspec(dllexport) void test(){
printf("called\n");
GoCalltest();
}
//wrapper.h
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) void test();
#ifdef __cplusplus
}
#endif
使用命令编译
gcc -o wrapper.obj -c wrapper.c
ar r wrapper.lib wrapper.obj
然后我在 vs 中创建一个测试 cpp
#include "wrapper.h"
#pragma comment(lib,"wrapper.lib")
//LINK file for stdc import in wrapper.lib
#pragma comment(lib,"libmsvcrt.a")
int main() {
test();
}
在没有警告和错误的情况下成功构建
然后我执行可执行文件,我得到了正确的输出
第二次尝试
用 gcc 链接 golang 输出
package main
import "C"
import "fmt"
func main(){
}
//export GoCallTest
func GoCalltest() {
fmt.Println("CallFrom C!!!!" )
}
使用 go build -buildmode=c-archive -o libtest.a test.go
构建
我创建了另一个 test.cpp 来调用 GoCallTest
我使用 gcc -o t.exe test.cpp libtest.a
并且得到了正确的输出
第三次尝试
将 golang 输出与 msvc 链接
我构建了我上面提到的 go 文件
然后我把 test.lib 替换成 golang 的 lib
但是我在运行 msbuild
golang.lib(go.o) LINK : warning LNK4078: multiple ".text" sections found with different attributes (60600060)
当我运行 exe 时,它没有像我预期的那样输出任何内容,但是 exe 没有退出但什么也不做
谁能帮忙解决问题?谢谢!
抱歉我的英语不好
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)