Go與C/C++ 互相調用


1、Go調用C:在go文件里調C(以下代碼中除了開頭的注釋之外,其他注釋不可刪除)

/*
 * go 和 C 互調用程序
 */

package main

/*
int Add( int a, int b ) {
      return a + b;
}
*/
import "C"
import (
      "fmt"
)

func main() {
      fmt.Println(C.Add(1, 2))
}

上面的C代碼雖然被“注釋”了,但是Go可以直接調

2、Go調用C:通過.h頭文件調(以下代碼中除了開頭的注釋之外,其他注釋不可刪除)

/*
 * go 和 C 互調用程序
 */

package main

/*
#include "MyHeadFile.h"
*/
import "C"
import (
      "fmt"
)

func main() {
      fmt.Println(C.MyFunc("Hello"))
}

上面代碼以注釋的方式導入MyHeadFile.h頭文件,然后可以直接使用其中的函數

3、Go生成動態庫dll(以下代碼中除了開頭的注釋之外,其他注釋不可刪除)

/*
 * Go生成動態庫的命令(Windows平台需安裝mingw-w64):
 * go build -o hello.dll -buildmode=c-shared hello.go
 * go build -o hello.so -buildmode=c-shared hello.go
 */
package main

import "C"
import (
      "fmt"
)

//export HelloGolang
func HelloGolang() {
      fmt.Println("HelloGolang")
}

func main() {
      fmt.Println("main")
}

4、示例:Go調C並返回

package main

/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN 1024

char* Foo( char *input ) {
    char* res = malloc( LEN * sizeof( char ) );
    sprintf( res, "%s %s", input, "World!" );
    return res;
}*/
import "C"
import (
    "fmt"
    "unsafe"
)

func getID() string {
    cs  := C.CString( "Hello" )
    res := C.Foo( cs )
    str := C.GoString( res )
    C.free( unsafe.Pointer( cs ) )
    C.free( unsafe.Pointer( res) )
    return str
}

func main() {
    fmt.Println( getID() )
}

未完待續...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM