0

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.

kpage
  • 11
  • 1
  • 1

1 Answers1

0
  1. project properties -> linker -> input -> additional dependencies
  • legacy_stdio_definitions.lib;%(AdditionalDependencies)
  1. add source code

    C

    FILE* __cdecl __iob_func(void)
    {
        FILE _iob[] = { *stdin, *stdout, *stderr };
        return _iob;
    }
    

    C++

    extern "C" { FILE __iob_func[3] = { *stdin,*stdout,*stderr }; }
    
Josef
  • 2,869
  • 2
  • 22
  • 23
철진정
  • 1
  • 2