mirror of
https://github.com/golang/go
synced 2024-11-22 00:54:43 -07:00
cgo: add support for callbacks from dynamic libraries
R=golang-dev, rsc CC=golang-dev, mpimenov https://golang.org/cl/5375042
This commit is contained in:
parent
95e60acb97
commit
11e73b89ca
22
misc/cgo/testso/Makefile
Normal file
22
misc/cgo/testso/Makefile
Normal file
@ -0,0 +1,22 @@
|
||||
# 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.
|
||||
|
||||
include ../../../src/Make.inc
|
||||
|
||||
TARG=cgosotest
|
||||
|
||||
CGO_DEPS+=libcgoso.so
|
||||
CGO_LDFLAGS+=-lcgoso -L.
|
||||
CLEANFILES+=out libcgoso.so
|
||||
CGOFILES=\
|
||||
cgoso.go\
|
||||
|
||||
include ../../../src/Make.pkg
|
||||
|
||||
libcgoso.so: cgoso_c.c
|
||||
gcc cgoso_c.c -fPIC -o $@ $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS))
|
||||
|
||||
out: install main.go
|
||||
$(GC) main.go
|
||||
$(LD) -o $@ main.$O
|
16
misc/cgo/testso/cgoso.go
Normal file
16
misc/cgo/testso/cgoso.go
Normal file
@ -0,0 +1,16 @@
|
||||
// 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.
|
||||
|
||||
package cgosotest
|
||||
|
||||
//void sofunc(void);
|
||||
import "C"
|
||||
|
||||
func Test() {
|
||||
C.sofunc()
|
||||
}
|
||||
|
||||
//export goCallback
|
||||
func goCallback() {
|
||||
}
|
9
misc/cgo/testso/cgoso_c.c
Normal file
9
misc/cgo/testso/cgoso_c.c
Normal file
@ -0,0 +1,9 @@
|
||||
// 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.
|
||||
|
||||
void sofunc(void)
|
||||
{
|
||||
extern void goCallback(void);
|
||||
goCallback();
|
||||
}
|
11
misc/cgo/testso/main.go
Normal file
11
misc/cgo/testso/main.go
Normal file
@ -0,0 +1,11 @@
|
||||
// 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.
|
||||
|
||||
package main
|
||||
|
||||
import "cgosotest"
|
||||
|
||||
func main() {
|
||||
cgosotest.Test()
|
||||
}
|
@ -162,7 +162,7 @@ endif
|
||||
# After main we have to define all the symbols that will be provided
|
||||
# by Go code. That's crosscall2 and any exported symbols.
|
||||
|
||||
_cgo1_.o: _cgo_main.o $(CGO_OFILES)
|
||||
_cgo1_.o: _cgo_main.o $(CGO_OFILES) $(CGO_DEPS)
|
||||
$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ $^ $(CGO_LDFLAGS) $(_CGO_LDFLAGS)
|
||||
|
||||
_obj/_cgo_import.c: _cgo1_.o
|
||||
|
@ -501,6 +501,7 @@ func (p *Package) writeExports(fgo2, fc, fm *os.File) {
|
||||
if fn.Recv != nil {
|
||||
goname = "_cgoexpwrap" + cPrefix + "_" + fn.Recv.List[0].Names[0].Name + "_" + goname
|
||||
}
|
||||
fmt.Fprintf(fc, "#pragma dynexport %s %s\n", goname, goname)
|
||||
fmt.Fprintf(fc, "extern void ·%s();\n", goname)
|
||||
fmt.Fprintf(fc, "\nvoid\n")
|
||||
fmt.Fprintf(fc, "_cgoexp%s_%s(void *a, int32 n)\n", cPrefix, exp.ExpName)
|
||||
|
@ -73,6 +73,15 @@ gomake clean
|
||||
gotest
|
||||
) || exit $?
|
||||
|
||||
[ "$CGO_ENABLED" != 1 ] ||
|
||||
[ "$GOHOSTOS" == windows ] ||
|
||||
[ "$GOHOSTOS" == darwin ] ||
|
||||
(xcd ../misc/cgo/testso
|
||||
gomake clean
|
||||
gomake out
|
||||
LD_LIBRARY_PATH=. ./out
|
||||
) || exit $?
|
||||
|
||||
(xcd ../doc/progs
|
||||
time ./run
|
||||
) || exit $?
|
||||
|
Loading…
Reference in New Issue
Block a user