diff --git a/misc/cgo/testso/cgoso.c b/misc/cgo/testso/cgoso.c index 917f472d36..5882b4a7be 100644 --- a/misc/cgo/testso/cgoso.c +++ b/misc/cgo/testso/cgoso.c @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include "cgoso_c.h" #include "_cgo_export.h" #ifdef WIN32 @@ -12,3 +13,7 @@ void init() { #else void init() {} #endif + +const char* getVar() { + return exported_var; +} diff --git a/misc/cgo/testso/cgoso.go b/misc/cgo/testso/cgoso.go index ba6218348c..36f1dcdad2 100644 --- a/misc/cgo/testso/cgoso.go +++ b/misc/cgo/testso/cgoso.go @@ -5,6 +5,7 @@ package cgosotest /* +#cgo windows CFLAGS: -DIMPORT_DLL // intentionally write the same LDFLAGS differently // to test correct handling of LDFLAGS. #cgo linux LDFLAGS: -L. -lcgosotest @@ -15,14 +16,32 @@ package cgosotest #cgo darwin LDFLAGS: -L. libcgosotest.dylib #cgo windows LDFLAGS: -L. libcgosotest.dll +#include "cgoso_c.h" + void init(void); void sofunc(void); +const char* getVar(void); */ import "C" +import "fmt" + func Test() { C.init() C.sofunc() + testExportedVar() +} + +func testExportedVar() { + const want = "Hello world" + got := C.GoString(C.getVar()) + if got != want { + panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want)) + } + got = C.GoString(C.exported_var) + if got != want { + panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want)) + } } //export goCallback diff --git a/misc/cgo/testso/cgoso_c.c b/misc/cgo/testso/cgoso_c.c index 7a38022b54..9c4538498e 100644 --- a/misc/cgo/testso/cgoso_c.c +++ b/misc/cgo/testso/cgoso_c.c @@ -4,6 +4,8 @@ // +build ignore +#include "cgoso_c.h" + #ifdef WIN32 // A Windows DLL is unable to call an arbitrary function in // the main executable. Work around that by making the main @@ -28,3 +30,5 @@ void sofunc(void) { goCallback(); } + +const char *exported_var = "Hello world"; diff --git a/misc/cgo/testso/cgoso_c.h b/misc/cgo/testso/cgoso_c.h new file mode 100644 index 0000000000..45073c6a1f --- /dev/null +++ b/misc/cgo/testso/cgoso_c.h @@ -0,0 +1,17 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +#ifdef WIN32 +#if defined(EXPORT_DLL) +# define VAR __declspec(dllexport) +#elif defined(IMPORT_DLL) +# define VAR __declspec(dllimport) +#endif +#else +# define VAR +#endif + +VAR const char *exported_var; diff --git a/misc/cgo/testso/test.bat b/misc/cgo/testso/test.bat index 7bbabea6b9..a5d19dee6f 100644 --- a/misc/cgo/testso/test.bat +++ b/misc/cgo/testso/test.bat @@ -4,7 +4,7 @@ @echo off -gcc -c cgoso_c.c +gcc -c cgoso_c.c -DEXPORT_DLL gcc -shared -o libcgosotest.dll cgoso_c.o if not exist libcgosotest.dll goto fail go build main.go