微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 golang c-static 与 msvc 项目联系起来

如何解决将 golang c-static 与 msvc 项目联系起来

嗨,我正在尝试为其他程序构建一个 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 链接

由于gcc输出coff文件所以我尝试直接链接

//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 举报,一经查实,本站将立刻删除。