从Visual Studio 2019中的C项目访问Golang代码

我在Visual Studio 2019中有一个C项目,我想在其中使用用Go编写的某些功能。 / p>

我有一个名为 ctest.go </ code>的测试文件,该文件包含以下内容:</ p>

  package main 

import(
“ C”
“ fmt”

//导出printInt
func printInt(x int){
fmt.Printf(“ Hello from go:%d”,x)\ n}

func main(){}
</ code> </ pre>

我正在使用以下命令生成静态库:</ p>

   go build -buildmode = c-archive ctest.go 
</ code> </ pre>

我最终得到两个文件,分别是 ctest.a </ code>和< 我在VS项目中包含的code> ctest.h </ code>。 我在代码中包含了 ctest.h </ code>并立即得到以下错误:</ p>

 标识符“ SIZE_TYPE”未定义
期望';'
期望 ';'
</ code> </ pre>

生成的头文件包含以下导致其的行:</ p>

  typedef SIZE_TYPE GoUintptr;

typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;
</ code> </ pre>

我用 size_t </ code>替换了 __ SIZE_TYPE __ </ code> 注释掉 _Complex </ code>行以停止错误。</ p>

现在,我的VS项目正在编译,同时包含头文件。 但是,一旦我尝试使用这样的go函数:</ p>

  printInt(5); 
</ code> </ pre>

我收到2条警告,然后是6条错误:</ p>

 警告LNK4078找到多个具有不同属性的'.text'部分(60600060)AWO F:\ AWO \ AWO \ ctest.a(  go.o)
警告LNK4078找到具有不同属性的多个'.text'部分(60600060)AWO F:\ AWO \ AWO \ ctest.a(go.o)
错误LNK2019无法解析的外部符号__imp___iob在函数__cgo_preinit_init中引用AWO F: \ AWO \ AWO \ ctest.a(000005.o)
错误LNK2001无法解析的外部符号__imp___iob AWO F:\ AWO \ AWO \ ctest.a(000006.o)
错误LNK2001无法解析的外部符号__imp___iob AWO F:\ AWO \ AWO \ ctest.a(000007.o)
错误LNK2019未解析的外部符号_fprintf在函数_x_cgo_sys_thread_create中引用AWO F:\ AWO \ AWO \ ctest.a(000005.o)
错误LNK2001不可解析的外部符号_fprintf AWO F:\ AWO \ AWO \ ctest.a(000007.o)
错误LNK1120 2个未解析的外部组件AWO F:\ AWO \ Debug \ AWO.exe 1
</ code> </ pre>

这就是我遇到的问题。 我不确定自己在做错什么,还是应该做不同的事情才能正确使用go生成的库。</ p>
</ div>

展开原文

原文

I have a C project in Visual Studio 2019 and I would like to use certain functions written in Go within it.

I have a test file called ctest.go which has the following contents:

package main

import (
    "C"
    "fmt"
)

//export printInt
func printInt(x int) {
    fmt.Printf("Hello from go: %d", x)
}

func main() {}

I'm generating a static library with this command:

go build -buildmode=c-archive ctest.go

I end up with two files, ctest.a and ctest.h which I include in my VS project. I include ctest.h in my code and immediately get these errors:

identifier "__SIZE_TYPE__" is undefined
expected a ';'
expected a ';'

The generated header file contains the following lines which caused it:

typedef __SIZE_TYPE__ GoUintptr;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;

I replaced __SIZE_TYPE__ by size_t and just commented out the _Complex lines to stop the errors.

Now my VS project compiles while including the header file. But as soon as I try to use my go function like this:

printInt(5);

I get 2 warnings followed by 6 errors:

Warning LNK4078 multiple '.text' sections found with different attributes (60600060)    AWO F:\AWO\AWO\ctest.a(go.o)
Warning LNK4078 multiple '.text' sections found with different attributes (60600060)    AWO F:\AWO\AWO\ctest.a(go.o)
Error   LNK2019 unresolved external symbol __imp___iob referenced in function __cgo_preinit_init    AWO F:\AWO\AWO\ctest.a(000005.o)
Error   LNK2001 unresolved external symbol __imp___iob  AWO F:\AWO\AWO\ctest.a(000006.o)
Error   LNK2001 unresolved external symbol __imp___iob  AWO F:\AWO\AWO\ctest.a(000007.o)
Error   LNK2019 unresolved external symbol _fprintf referenced in function _x_cgo_sys_thread_create AWO F:\AWO\AWO\ctest.a(000005.o)
Error   LNK2001 unresolved external symbol _fprintf AWO F:\AWO\AWO\ctest.a(000007.o)
Error   LNK1120 2 unresolved externals  AWO F:\AWO\Debug\AWO.exe    1   

This is where I'm stuck. I'm not sure what I'm doing wrong or should be doing differently to properly use the library generated with go.

c
duanji1902
duanji1902 我认为VisualStudio不支持.a文件格式。尝试将其编译为.lib和static。
大约一年之前 回复
duanrui3480
duanrui3480 这里有很多stackoverflow.com/questions/6125683/call-go-functions-from-c
大约一年之前 回复
doulu2576
doulu2576 我相信是的,我已经将ctest.a添加到“其他依赖项”并将其目录添加到“其他库目录”
大约一年之前 回复
dongzuan4491
dongzuan4491 您没有链接库。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问