我通过GoLang的包在C上编写了一个包含Objective代码(调用一些OSX )的程序,我需要将T类型的变量从Go代码传递给Objective代码,反之亦然。T是结构(或其他类型)。因此,我需要在GoLang中创建兼容的类型/变量(就内存布局而言),并通过unsafe.Pointer转换将其传递给Objective。对于一般的C代码,在这种情况下我使用godefs,但是我不能使用godefs来实现Objective。如果我尝试go tool cgo -godefs cgodefs.go
// This is "cgodefs.go" file
package tmp
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Cocoa/Cocoa.h>
*/
import "C"
type CGPoint C.CGPoint我收到了很多错误:
In file included from /Users/unsacrificed/go/src/gui/cgodefs.go:10:
In file included from /System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:
/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:503:1: error: expected identifier or '('
@class NSString, Protocol;
^
/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:505:9: error: unknown type name 'NSString'
typedef NSString * NSExceptionName NS_EXTENSIBLE_STRING_ENUM;
^
/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:506:9: error: unknown type name 'NSString'
typedef NSString * NSRunLoopMode NS_EXTENSIBLE_STRING_ENUM;
... (100000+ lines of errors)感兴趣的是,我可以通过C GoLang的软件包编译和运行带有Objective的C应用程序。
我报告到GoLang,但他说
cgo工具使用的是C,而不是Objective。
对于Objective类型,有什么方法可以获得GoLang等效(内存兼容)类型吗?
发布于 2018-03-11 13:12:09
最后我找到了解决办法。做我想做的事是可能的。我唯一错过的是:godefs忽略了#cgo CFLAGS: -x objective-c行。解决方案-需要将CFLAGS作为参数传递到go二进制文件(-- -x objective-c)。工作实例:
// +build ignore
package tmp
//go:generate go tool cgo -godefs -- -x objective-c cgodefs.go
//#import <Cocoa/Cocoa.h>
import "C"
type CGPoint C.CGPoint产出:
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs -- -x objective-c cgodefs.go
package tmp
type CGPoint struct {
X float64
Y float64
}https://stackoverflow.com/questions/48527333
复制相似问题