Go集成c&c++代码

A
Andy ShiSoftware Developer at YashiSoft
GO语言中国用户组                http://golang-china.org/




      GO集成C/C++代码
            chaishushan@gmail.com
内容大纲

如何编写包
  包代码
  Makefile文件
  使用包
用CGO工具编写包
  包代码
  Makefile文件
  cgo语法
用SWIG工具编写包
相关资源
如何编写包-HELLO

// file: ./org.golang-china.sz/hello/hello.go

package hello

import "fmt"

func PrintHello() {
  fmt.Printf("Hello, 世界n")
}
如何编写包-MAKEFILE文件

# file: ./org.golang-china.sz/hello/Makefile

include $(GOROOT)/src/Make.inc

TARG=org.golang-china.sz/hello
GOFILES=hello.go

include $(GOROOT)/src/Make.pkg
如何编写包-使用包

// file: ./org.golang-china.sz/hello/helloapp.go

package main

import "org.golang-china.sz/hello"

func main() {
  print("hello,")
  hello.PrintHello()
}
如何编写包-完善MAKEFILE

# file: ./org.golang-china.sz/hello/Makefile

include $(GOROOT)/src/Make.inc

TARG=mypkg/hello
GOFILES=hello.go

include $(GOROOT)/src/Make.pkg

# Simple test programs
%: install %.go
  $(GC) $*.go
  $(LD) -o $@ $*.$O
如何编写包-编译运行

cd org.golang-china.sz/hello
make nuke
make helloapp
./helloapp


也可以基于gotest编写包测试,详细信息可参考文档。
内容大纲

如何编写包
  包代码
  Makefile文件
  使用包
用CGO工具编写包
  包代码
  Makefile文件
  cgo语法
用SWIG工具编写包
相关资源
用C语言编写包-工具

 GC中的CGO支持用C语言开发包
 GCCGO支持链接C/C++开发的动态库(?)
 SWIG-2.0.1开始支持GO语言(GC和GCCGO)
 最新进展:Roadmap和Release History
用C语言编写包-代码

//file: ./org.golang-china.sz/hello2/hello.go

package hello2

/*
// 这行是注释
#include <stdio.h>
*/
import "C"

func PrintHello() {
  C.puts(C.CString("Hello, worldn"))
}
用C语言编写包-MAKEFILE
# file: ./org.golang-china.sz/hello2/Makefile

include $(GOROOT)/src/Make.inc

TARG=org.golang-china.sz/hello2
CGOFILES=hello2.go

include $(GOROOT)/src/Make.pkg

# Simple test programs
%: install %.go
  $(GC) $*.go
  $(LD) -o $@ $*.$O
用C语言-导入C头文件

// #include <stdio.h>
// #include <errno.h>
import "C"

C语言中的类型和变量将通过伪包"C"来访问,如:
  类型:C.size_t
  变量:C.stdout
  函数:C.putchar
用C语言编写包-导入第三方C库
include $(GOROOT)/src/Make.inc

TARG=pkgname
GOFILES=gofiles.go
CGOFILES=cgofiles.go

CGO_CFLAGS=-I/home/rsc/gmp32/include
CGO_LDFLAGS=-L/home/rsc/gmp32/lib -lgmp

include $(GOROOT)/src/Make.pkg
用C语言-代码中导入库

// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo linux CFLAGS: -DLINUX=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"

通过cgo参数可以从代码设置编译参数。
用C语言-标准类型

 C.char, C.schar(signed char), C.uchar(unsigned char)
 C.short, C.ushort (unsigned short)
 C.int, C.uint (unsigned int)
 C.long, C.ulong (unsigned long)
 C.longlong(long long), C.ulonglong(unsigned long long)
 C.float, C.double
用C语言-字符串和指针
package stdio
/*
#include <stdio.h>
char* greeting = "hello, world";
*/
import "C"
import "unsafe"

type File C.FILE
var Greeting = C.GoString(C.greeting)

func (f *File) WriteString(s string) {
  p := C.CString(s)
  C.fputs(p, (*C.FILE)(f))
  // 字符串需要是手工释放
  C.free(unsafe.Pointer(p))
}
用C语言-数组和指针
数组转为指针是必须先取第一个元素的地址,然后作类型转换:

// c-life.c
void Step(int x, int y, int* a, int* n) {
   // ...
}

// life.go
func Run(gen, x, y int, a []int) {
  n := make([]int, x*y)
  for i := 0; i < gen; i++ {
       C.Step(C.int(x), C.int(y),
          (*C.int)(unsafe.Pointer(&a[0])),
          (*C.int)(unsafe.Pointer(&n[0])))
       copy(a, n)
  }
}
用C语言-STRUCT/UNION/ENUM/宏
/*
#define MYCONST 1024
typedef struct { int s1; int s1; } Struct1;
typedef union { int u2; int u2; } Union1;
typedef enum { E1 = 0x0000, E2 = 0x8000 } Enum1;
*/
import "C"

func Foo(size C.CvSize) {
  var myStruct C.Struct1
  var myUnion C.Union1
  var myEnum C.Enum1

    myStruct.s1 = C.MYCONST
    myUnion.u1 = C.(20)
    myEnum = C.E1
}
用C语言-define的限制
https://code.google.com/p/go/source/detail?r=bcbfbe066b

Log message
cgo: Only allow numeric / string / character type constants for
references to #defined things.

Fixes issue 520 .

R=rsc, rsaarelm
CC=golang-dev
http://codereview.appspot.com/186138

Committer: Russ Cox <rsc@golang.org>


golang-nuts讨论:CGO and #define
用C语言-_cgo_export.h
/* Created by cgo - DO NOT EDIT. */

typedef unsigned int uint;
typedef signed char schar;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef long long int64;
typedef unsigned long long uint64;
typedef __SIZE_TYPE__ uintptr;

typedef struct { char *p; int n; } GoString;
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
用C语言-函数参数和返回值
在返回函数值同时可以返回error值:

n, err := C.atoi("abc")
if err != nil {
    return err
}

不支持参数可变顶C函数,如printf;
详情见(Issue975):
http://code.google.com/p/go/issues/detail?id=975
用C语言-C回调GO函数
life.go
//export GoStart
// Double return value is just for testing.
func GoStart(x, y C.int) (int, int) {
   return int(0), int(100)
}

c-life.c
#include "_cgo_export.h"
void Step(int x, int y)
{
   // GO函数多个返回值
   struct GoStart_return r;
   r = GoStart(x, y);
   assert(r.r0 == 0 && r.r1 == 100);
}
用C语言例子:GO-GTK
  https://github.com/mattn/go-gtk
内容大纲

如何编写包
  包代码
  Makefile文件
  使用包
用CGO工具编写包
  包代码
  Makefile文件
  cgo语法
用SWIG工具编写包
相关资源
用SWIG编写包-C代码
/* File : example.c */
/* A global variable */
double Foo = 3.0;

int gcd(int x, int y) {
   int g = y;
   while (x > 0) {
      g = x;
      x = y % x;
      y = g;
   }
   return g;
}
用SWIG编写包-接口文件
/* File: example.i */
%module example

extern int gcd(int x, int y);
extern double Foo;
用SWIG编写包-演示代码
/* File: runme.go */
package main

import "fmt"
import "./example"

func main() {
  // Call our gcd() function
  x, y := 42, 105
  g := example.Gcd(x, y)
  fmt.Println("The gcd of", x, "and", y, "is", g)

    fmt.Println("Foo =", example.GetFoo())
    example.SetFoo(3.1415926)
    fmt.Println("Foo =", example.GetFoo())
}
用SWIG编写包-编译过程
 1. 运行 swig -go example.i,生成3个文件:example.go,example_gc.
    c,example_wrap.c
2. 编译 example.go:6g example.go
3. 编译 example_gc.c:6c example_gc.c
 4. 将以上2个目标文件打包为 example.a:gopack grc example.a
    example.6 example_gc.6
5. 编译 example_wrap.c(-fpic选项生存位置无关代码):gcc -c -O
    -fpic example_wrap.c
6. 编译原始的C代码:gcc -c -O -fpic example.c
 7. 将gcc生存顶目标文件做成共享库:gcc -shared -o example.so
    example_wrap.o example.o
8. 编译GO代码:6g runme.go
9. 链接:6l -o runme runme.6
用SWIG编写包-GC编译器
% swig -go interface.i
% gcc -fpic -c interface_wrap.c
% gcc -shared interface_wrap.o $(OBJS) -o nterfacemodule.so
% 6g interface.go
% 6c interface_gc.c
% gopack grc interface.a interface.6 interface_gc.6
% 6l program.6
用SWIG编写包-GCCGO编译器
% swig -go interface.i
% gcc -c interface_wrap.c
% gccgo -c interface.go
% gccgo program.o interface.o interface_wrap.o
用SWIG编写包-更多的例子
 http://www.swig.org/Doc2.0/Go.html#Go
 swig-dir/Examples/go/index.html
内容大纲

如何编写包
  包代码
  Makefile文件
  使用包
用CGO工具编写包
  包代码
  Makefile文件
  cgo语法
用SWIG工具编写包
相关资源
相关资源-网站

http://golang.org/
http://go-lang.cat-v.org/
http://golang-china.org/
http://go-lang.cat-v.org/library-bindings
QQ群:1023-1985-4
相关资源-中文文档
https://golang-china.googlecode.com/
欢迎参与GO的文档翻译和推广!
   http://golang-china.org
   http://golang.org
1 of 35

Recommended

竞赛中C++语言拾遗 by
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗乐群 陈
1.3K views64 slides
C python 原始碼解析 投影片 by
C python 原始碼解析 投影片C python 原始碼解析 投影片
C python 原始碼解析 投影片kao kuo-tung
2.1K views48 slides
Kasal by
KasalKasal
KasalAli Sheta
505 views117 slides
The Dark Side by
The Dark SideThe Dark Side
The Dark SideChistov Dmitry
588 views27 slides
ActiveConversion Lead Scoring by
ActiveConversion Lead ScoringActiveConversion Lead Scoring
ActiveConversion Lead ScoringActiveconversion
286 views7 slides
Increasing Trade Show ROI by
Increasing Trade Show ROIIncreasing Trade Show ROI
Increasing Trade Show ROIActiveconversion
428 views17 slides

More Related Content

Viewers also liked

사계절 출판사 by
사계절 출판사사계절 출판사
사계절 출판사guest4ab227
196 views11 slides
Go by
GoGo
GoAndy Shi
631 views12 slides
ActiveConversion ProspectAlert Presentation by
ActiveConversion ProspectAlert  PresentationActiveConversion ProspectAlert  Presentation
ActiveConversion ProspectAlert PresentationActiveconversion
1.3K views13 slides
Go语言web开发 by
Go语言web开发Go语言web开发
Go语言web开发Andy Shi
7.4K views21 slides
사계절 출판사 by
사계절 출판사사계절 출판사
사계절 출판사guest4ab227
157 views11 slides
사계절 출판사 by
사계절 출판사사계절 출판사
사계절 출판사guest4ab227
184 views11 slides

Viewers also liked(8)

사계절 출판사 by guest4ab227
사계절 출판사사계절 출판사
사계절 출판사
guest4ab227196 views
ActiveConversion ProspectAlert Presentation by Activeconversion
ActiveConversion ProspectAlert  PresentationActiveConversion ProspectAlert  Presentation
ActiveConversion ProspectAlert Presentation
Activeconversion1.3K views
Go语言web开发 by Andy Shi
Go语言web开发Go语言web开发
Go语言web开发
Andy Shi7.4K views
사계절 출판사 by guest4ab227
사계절 출판사사계절 출판사
사계절 출판사
guest4ab227157 views
사계절 출판사 by guest4ab227
사계절 출판사사계절 출판사
사계절 출판사
guest4ab227184 views
사계절 출판사 by guest4ab227
사계절 출판사사계절 출판사
사계절 출판사
guest4ab227219 views
Видеореклама: новые возможности, новые деньги by Chistov Dmitry
Видеореклама: новые возможности, новые деньгиВидеореклама: новые возможности, новые деньги
Видеореклама: новые возможности, новые деньги
Chistov Dmitry417 views

Similar to Go集成c&c++代码

Golang by
GolangGolang
Golangpopeast
2.4K views43 slides
Golang 入門初體驗 by
Golang 入門初體驗Golang 入門初體驗
Golang 入門初體驗政斌 楊
1.9K views65 slides
dbug in mysql by
dbug in mysqldbug in mysql
dbug in mysqlTim Chou
857 views7 slides
嵌入式測試驅動開發 by
嵌入式測試驅動開發嵌入式測試驅動開發
嵌入式測試驅動開發hugo lu
3.4K views71 slides
2016-04-07-清大-國際化開源專案技術實務與經驗分享 by
2016-04-07-清大-國際化開源專案技術實務與經驗分享2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享Jen Yee Hong
29.8K views26 slides
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境 by
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境均民 戴
942 views102 slides

Similar to Go集成c&c++代码(20)

Golang by popeast
GolangGolang
Golang
popeast2.4K views
Golang 入門初體驗 by 政斌 楊
Golang 入門初體驗Golang 入門初體驗
Golang 入門初體驗
政斌 楊1.9K views
dbug in mysql by Tim Chou
dbug in mysqldbug in mysql
dbug in mysql
Tim Chou857 views
嵌入式測試驅動開發 by hugo lu
嵌入式測試驅動開發嵌入式測試驅動開發
嵌入式測試驅動開發
hugo lu3.4K views
2016-04-07-清大-國際化開源專案技術實務與經驗分享 by Jen Yee Hong
2016-04-07-清大-國際化開源專案技術實務與經驗分享2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享
Jen Yee Hong29.8K views
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境 by 均民 戴
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
均民 戴942 views
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 by 升煌 黃
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
升煌 黃276 views
Groovy:Candy for Java Developers by foxgem
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developers
foxgem656 views
用Cython封装c++代码为python模块的一点经验 by Leo Zhou
用Cython封装c++代码为python模块的一点经验用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验
Leo Zhou506 views
Introduction to Golang final by Paul Chao
Introduction to Golang final Introduction to Golang final
Introduction to Golang final
Paul Chao466 views
漫談 Source Control Management by Wen-Shih Chao
漫談 Source Control Management漫談 Source Control Management
漫談 Source Control Management
Wen-Shih Chao509 views
mysql dbug by Tim Chou
mysql dbugmysql dbug
mysql dbug
Tim Chou1.2K views
Golangintro by 理 傅
GolangintroGolangintro
Golangintro
理 傅3.7K views
HTML+COIMOTION 開發跨平台 app by Ben Lue
HTML+COIMOTION 開發跨平台 appHTML+COIMOTION 開發跨平台 app
HTML+COIMOTION 開發跨平台 app
Ben Lue2.6K views
Erlang Practice by litaocheng
Erlang PracticeErlang Practice
Erlang Practice
litaocheng2.5K views
Go语言: 互联网时代的C by Googol Lee
Go语言: 互联网时代的CGo语言: 互联网时代的C
Go语言: 互联网时代的C
Googol Lee3K views
基于 FRIDA 的全平台逆向分析 by CC
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
CC 15.3K views
基于Eclipse和hadoop平台应用开发入门手册 by Zhen Li
基于Eclipse和hadoop平台应用开发入门手册基于Eclipse和hadoop平台应用开发入门手册
基于Eclipse和hadoop平台应用开发入门手册
Zhen Li4.8K views
Android 智慧型手機程式設計 by Kyle Lin
Android 智慧型手機程式設計Android 智慧型手機程式設計
Android 智慧型手機程式設計
Kyle Lin874 views

Recently uploaded

商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
40 views37 slides
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
43 views32 slides
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
43 views25 slides
Hacking Facebook for fun and profit by Pranav Hivarekar by
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarPranav Hivarekar
6 views69 slides
AI Technology & Development of Civilization by
AI Technology & Development of CivilizationAI Technology & Development of Civilization
AI Technology & Development of Civilizationunclebrown017
44 views74 slides
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
151 views54 slides

Recently uploaded(6)

商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
Hacking Facebook for fun and profit by Pranav Hivarekar by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav Hivarekar
AI Technology & Development of Civilization by unclebrown017
AI Technology & Development of CivilizationAI Technology & Development of Civilization
AI Technology & Development of Civilization
unclebrown01744 views
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by Shengyou Fan
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan151 views

Go集成c&c++代码