Mac下c調(diào)用go語言 go語言調(diào)用c++庫(kù)

go語言如何調(diào)用c函數(shù)

直接嵌入c源代碼到go代碼里面

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比偏關(guān)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式偏關(guān)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋偏關(guān)地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

package main

/*

#include stdio.h

void myhello(int i) {

printf("Hello C: %d\n", i);

}

*/

import "C"

import "fmt"

func main() {

C.myhello(C.int(12))

fmt.Println("Hello Go");

}

需要注意的是C代碼必須放在注釋里面

import "C"語句和前面的C代碼之間不能有空行

運(yùn)行結(jié)果

$ go build main.go ./main

Hello C: 12

Hello Go

分開c代碼到單獨(dú)文件

嵌在一起代碼結(jié)構(gòu)不是很好看,很多人包括我,還是喜歡把兩個(gè)分開,放在不同的文件里面,顯得干凈,go源文件里面是go的源代碼,c源文件里面是c的源代碼。

$ ls

hello.c hello.h main.go

$ cat hello.h

void hello(int);

$ cat hello.c

#include stdio.h

void hello(int i) {

printf("Hello C: %d\n", i);

}

$ cat main.go

package main

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

編譯運(yùn)行

$ go build ./main

Hello C: 12

Hello Go

編譯成庫(kù)文件

如果c文件比較多,最好還是能夠編譯成一個(gè)獨(dú)立的庫(kù)文件,然后go來調(diào)用庫(kù)。

$ find mylib main

mylib

mylib/hello.h

mylib/hello.c

main

main/main.go

編譯庫(kù)文件

$ cd mylib

# gcc -fPIC -shared -o libhello.so hello.c

編譯go程序

$ cd main

$ cat main.go

package main

// #cgo CFLAGS: -I../mylib

// #cgo LDFLAGS: -L../mylib -lhello

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

$ go build main.go

運(yùn)行

$ export LD_LIBRARY_PATH=../mylib

$ ./main

Hello C: 12

Hello Go

在我們的例子中,庫(kù)文件是編譯成動(dòng)態(tài)庫(kù)的,main程序鏈接的時(shí)候也是采用的動(dòng)態(tài)庫(kù)

$ ldd main

linux-vdso.so.1 = (0x00007fffc7968000)

libhello.so = ../mylib/libhello.so (0x00007f513684c000)

libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)

libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)

/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)

理論上講也是可以編譯成整個(gè)一靜態(tài)鏈接的可執(zhí)行程序,由于我的機(jī)器上缺少靜態(tài)鏈接的系統(tǒng)庫(kù),比如libc.a,所以只能編譯成動(dòng)態(tài)鏈接。

如何在Mac源碼安裝Go1.5開發(fā)環(huán)境

Go1.5開發(fā)環(huán)境依賴Go1.4版本作為引導(dǎo),因?yàn)镚o1.5使用Go本身來編譯安裝Go,所以必須保證服務(wù)器上已經(jīng)安裝Go1.4,這完全是為了解決先有雞還是先有蛋的問題,當(dāng)然如果你想避免編譯安裝1.4也可以直接使用二進(jìn)制包。

在這里假設(shè)你希望將go1.5安裝到$HOME/go1.5目錄下,只需要以下幾步:

下載Go1.5的源碼放到$HOME/go1.5目錄下

在安裝Go1.5之前需要將Go1.4放到$HOME/go1.4下面或者export GOROOT_BOOTSTRAP=/go1.4安裝目錄/

到$HOME/go1.5/src/下執(zhí)行all.bash即可

我習(xí)慣將軟件安裝至/usr/local/下,以下為我安裝Go1.5(/usr/local/go1.5)的步驟:

wget

tar zxvf go1.5.1.src.tar.gz

mv ./go /usr/local/go1.5

wget

tar zxvf go1.4.3.src.tar.gz

mv ./go /usr/local/go-bootstrap1.4/

cd /usr/local/go-bootstrap1.4/src

./all.bash //編譯安裝Go1.4,有可能test不通過,只要編譯通過,test可忽略,目的是需要go1.4的二進(jìn)制包來編譯1.5

cd /usr/local/go1.5/src

GOROOT_BOOTSTRAP=/usr/local/go-bootstrap1.4 ./all.bash

//可在環(huán)境變量中添加GOROOT_BOOTSTRAP,然后再編譯Go1.5

以下為網(wǎng)摘:

From C to Go

The gc tool chain is being converted from C to Go.

An ongoing process, started early 2014.

Russ Cox says "It'll be done by March [2015]."

New link tool to replace 6l, 8l, etc.

New asm tool to replace 6a, 8a, etc.

Machine-translated gc to replace 6g, 8g, etc.

Design doc:

golang.org/s/go13compiler

Go 1.5 will have no C code in the tool chain or runtime.

Go語言將使用Go代替C重寫運(yùn)行時(shí)環(huán)境

Go 1.4 的合并窗口在 9 月份將關(guān)閉,從現(xiàn)在開始到12月份發(fā)布 Go 1.4 之前將只接受 bug 修復(fù)和小調(diào)整。

Go 1.4 最主要的變化是將使用 Go 語言本身來重寫 Go 的運(yùn)行時(shí),而之前是采用 C 語言開發(fā)。這也是為什么 Go 的發(fā)行版中包含一個(gè) C

編譯器的原因。

使用 Go 重寫的好處是:

當(dāng)前如果在 Goroutine 的調(diào)用堆棧中發(fā)現(xiàn) C 代碼,runtime 將在需要增長(zhǎng)堆棧時(shí)回滾到老的堆棧方法。如果使用 Go 來重寫

runtime,那么堆??截惖姆椒ň蜁?huì)更加高效

目前轉(zhuǎn)換工作只計(jì)劃轉(zhuǎn) Go 編譯器 (5g, 6g, 8g), 而不是 C 編譯器,降低運(yùn)行時(shí)中的 C 代碼行數(shù),甚至可能完全清除

注意

這是 golang.org 分發(fā)版,也就是 gc ,而不是 gccgo

這是不同的 C 編譯器,gc 工具鏈將使用你系統(tǒng)的 C 編譯器來編譯,gc 運(yùn)行時(shí)則使用它的 C 編譯器來編譯

8月20日后增加的轉(zhuǎn)換行可能跟 this request 有關(guān).

Go語言將使用Go代替C重寫運(yùn)行時(shí)環(huán)境

— 從現(xiàn)在開始到12月份 Go 1.4版本發(fā)布前,Go將只接受Bug修復(fù)和小范圍的調(diào)整,Go

1.4版本將實(shí)現(xiàn)使用Go語言來重寫Go的運(yùn)行時(shí)環(huán)境。

mac安裝influxdb及golang的簡(jiǎn)單調(diào)用

1.mac肯定是brew安裝啦

配置文件在/etc/influxdb/influxdb.conf ,如果沒有就將/usr/local/etc/influxdb.conf 拷一個(gè)過去

cache-max-memory-size是用來配置緩存的

2.啟動(dòng)客戶端

3.基本操作

golang 在Mac 上無法調(diào)試的問題,請(qǐng)問如何解決

mac下編譯器默認(rèn)編譯的是mac os x的可執(zhí)行文件。

編譯centos上的可執(zhí)行文件的時(shí)候需要交叉編譯。

golang的交叉編譯很容易,情況用下面這條命令 GOOS=linux GOARCH=amd64 go build ./文件

標(biāo)題名稱:Mac下c調(diào)用go語言 go語言調(diào)用c++庫(kù)
鏈接URL:http://muchs.cn/article6/dosheig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)微信小程序、網(wǎng)站策劃虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)